Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 70333 | Accepted: 27336 |
Descriptionui
Inputthis
Outputspa
Sample Inputcode
5 4 1 2 40 1 4 20 2 4 20 2 3 30 3 4 10
Sample Outputorm
50
Dinic實現最大流.
#include <cstdio> #include <cstring> #include <queue> #include <algorithm> using namespace std; const int MAXN=205; const int INF=0x3f3f3f3f; int arc[MAXN][MAXN]; int n,m; int level[MAXN]; bool bfs(int src,int ter) { memset(level,-1,sizeof(level)); queue<int> que; que.push(src); level[src]=0; while(!que.empty()) { int u=que.front();que.pop(); for(int i=1;i<=n;i++) { if(level[i]<0&&arc[u][i]>0) { que.push(i); level[i]=level[u]+1; } } } if(level[ter]>0) return true; else return false; } int dfs(int u,int ter,int f) { if(u==ter) return f; for(int i=1;i<=n;i++) { int d; if(arc[u][i]>0&&level[i]==level[u]+1&&(d=dfs(i,ter,min(arc[u][i],f)))) { arc[u][i]-=d; arc[i][u]+=d; return d; } } return 0; } int max_flow(int src,int ter) { int ans=0; int d; while(bfs(src,ter)) { while(d=dfs(src,ter,INF)) ans+=d; } return ans; } int main() { // freopen("input.in","r",stdin); while(scanf("%d%d",&m,&n)!=EOF) { memset(arc,0,sizeof(arc)); for(int i=0;i<m;i++) { int from,to,w; scanf("%d%d%d",&from,&to,&w); arc[from][to]+=w; } int res=max_flow(1,n); printf("%d\n",res); } return 0; }