usaco Pollutant Control
生活随笔
收集整理的這篇文章主要介紹了
usaco Pollutant Control
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
第一問是求最小割。第二問求最小割中集合中邊最少的集合的大小。
第三問求集合中邊最少且字典序最小的邊的下標。
第一問直接求最大流就能解,第二問將原來的邊的容量都改為1,求出來的最大流就是元素最少的一個最小割的大小。
將容量都改為1之后,直接枚舉每個邊和前面已經(jīng)找到的邊在同一個集合中,是的話輸出邊的下標。
/*
ID: modengd1
PROG: milk6
LANG: C++
*/
#include <iostream>
#include <memory.h>
#include <stdio.h>
#include <vector>
#include <queue>
using namespace std;
int N,M;
int level[33];
int input[33][33];
int inputC[33][33];
struct Edge
{int x,y,w;
};
vector<Edge> Edges;
void BFS(int s)
{memset(level,-1,sizeof(level));level[s]=0;queue<int> Q;Q.push(s);while(!Q.empty()){int now=Q.front();Q.pop();for(int i=1;i<=N;i++){if(input[now][i]&&level[i]<0){level[i]=level[now]+1;Q.push(i);}}}
}
int DFS(int s,int t,int f)
{if(s==t)return f;for(int i=1;i<=N;i++){if(input[s][i]&&level[i]==level[s]+1){int d=DFS(i,t,min(f,input[s][i]));if(d>0){input[s][i]-=d;input[i][s]+=d;return d;}}}return 0;
}
int max_flow(int s,int t)
{int flow=0;while(true){BFS(s);if(level[t]<0)return flow;int f;while((f=DFS(s,t,0x7fffffff))>0){flow+=f;} }
}
int main()
{freopen("milk6.in","r",stdin);freopen("milk6.out","w",stdout);scanf("%d%d",&N,&M);memset(input,0,sizeof(input));for(int i=0;i<M;i++){int a,b,c;scanf("%d%d%d",&a,&b,&c);Edges.push_back((Edge){a,b,c});input[a][b]+=c;}int ans1=max_flow(1,N);cout<<ans1;for(int i=0;i<Edges.size();i++){input[Edges[i].x][Edges[i].y]+=1;}memcpy(inputC,input,sizeof(inputC));int ans2=max_flow(1, N);cout<<' '<<ans2<<endl;for(int i=0;i<Edges.size();i++){memcpy(input,inputC,sizeof(input));input[Edges[i].x][Edges[i].y]-=1;memcpy(inputC,input,sizeof(inputC));int f=max_flow(1,N);if(f<ans2){cout<<i+1<<endl;ans2=f;}else {inputC[Edges[i].x][Edges[i].y]+=1;}}
}
?
轉(zhuǎn)載于:https://www.cnblogs.com/modengdubai/p/4867538.html
總結(jié)
以上是生活随笔為你收集整理的usaco Pollutant Control的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 求一个霸气好听的微信网名
- 下一篇: FineReport——权限分配以及自定