dfs() 操作的返回值 没搞懂----(标记)
int dfs(int x,int a)//正确返回值 { if(x==n||a==0) return a; int f,ans=a; for(int i=1;i<=n;i++) { if((d[i]==d[x]+1)&&cap[x][i]>0&&(f=dfs(i,min(a,cap[x][i])))) { cap[x][i]-=f; cap[i][x]+=f; a-=f; //cout<<"f "<<f<<endl; } } return ans-a; }
int dfs(int x,int a)//错误返回值 { if(x==n||a==0) return a; int f,ans=0; for(int i=1;i<=n;i++) { if((d[i]==d[x]+1)&&cap[x][i]>0&&(f=dfs(i,min(a,cap[x][i])))) { cap[x][i]-=f; cap[i][x]+=f; ans+=f; } } return ans; }
int dfs(int x,int a)//错误返回值 { if(x==n||a==0) return a; int f; for(int i=1;i<=n;i++) { if((d[i]==d[x]+1)&&cap[x][i]>0&&(f=dfs(i,min(a,cap[x][i])))) { cap[x][i]-=f; cap[i][x]+=f; return f;//这样修改 MAXflow函数的dfs()要重复执行 //cout<<"f "<<f<<endl; } } return 0; }
———————————————————————————————分割线—————————————————————————————————
AC代码如下:
#include<iostream> #include<algorithm> #include<cstring> #include<queue> #include<cstdio> using namespace std; #define inf 1000000 int d[210]; int cap[210][210]; int m,n; int bfs(int s,int t) { memset(d,-1,sizeof(d)); d[s]=0; queue<int> q; int u,v; q.push(s); while(!q.empty()) { u=q.front();q.pop(); for(v=1;v<=n;v++) { if(d[v]==-1&&cap[u][v]>0) { d[v]=d[u]+1; q.push(v); } } } if(d[t]==-1) return 0; else return 1; } int dfs(int x,int a) { if(x==n||a==0) return a; int f,ans=a; for(int i=1;i<=n;i++) { if((d[i]==d[x]+1)&&cap[x][i]>0&&(f=dfs(i,min(a,cap[x][i])))) { cap[x][i]-=f; cap[i][x]+=f; a-=f; //cout<<"f "<<f<<endl; } } return ans-a; } int MAXflow(int s,int t) { long long Flow=0; while(bfs(s,t)) { Flow+=dfs(s,inf); } return Flow; } int main() { int i,f,a,b,c; while(cin>>m>>n) { memset(cap,0,sizeof(cap)); for(i=0;i<m;i++) { scanf("%d%d%d",&a,&b,&c); cap[a][b]+=c; } printf("%lld\n",MAXflow(1,n)); } return 0; }