网络流之dinic算法

xiaoxiao2021-02-28  92

dinic详解 : 文章详解地址 贴一下我的代码: poj1273 #include<cstdio> #include<string> #include<cstring> #include<cstdlib> #include<cmath> #include<iostream> #include<algorithm> #include<vector> #include<queue> #include<map> #include<set> #include<stack> #define ll long long #define read(a) scanf("%d",&a); using namespace std; const int maxn=205; const int inf=99999999; int c[maxn][maxn]; int dis[maxn]; int m,n; int ans; bool bfs(){ int i,j; memset(dis,-1,sizeof(dis)); //printf("%d\n",dis[0]) dis[1]=0; queue<int>que; que.push(1); while(!que.empty()){ j=que.front(); que.pop(); for(i=1;i<=n;i++){ if(dis[i]<0&&c[j][i]>0){ dis[i]=dis[j]+1; que.push(i); } } } if(dis[n]>0) return true; return false; } int find(int x,int low){ int i,a=0; if(x==n) return low; for(i=1;i<=n;i++){ if(c[x][i]>0 &&dis[i]==dis[x]+1 &&(a=find(i,min(low,c[x][i])))){ c[x][i]-=a; c[i][x]+=a; return a; } } return 0; } int main(){ freopen("test.txt","r",stdin); int u,v,val; while(~scanf("%d %d",&m,&n)){ //printf("%d %d\n",m,n); memset(c,0,sizeof(c)); for(int i=0;i<m;i++){ scanf("%d %d %d",&u,&v,&val); c[u][v]+=val; } // for(int i=1;i<=n;i++){ // for(int j=1;j<=n;j++){ // printf("%d ",c[i][j]); // } // printf("\n"); // } int tmp; ans=0; while(bfs()){ while(tmp=find(1,inf)) ans+=tmp; } printf("%d\n",ans); } return 0; } poj1459 #include<cstdio> #include<string> #include<cstring> #include<cstdlib> #include<cmath> #include<iostream> #include<algorithm> #include<vector> #include<queue> #include<map> #include<set> #include<stack> #define ll long long #define read(a) scanf("%d",&a); using namespace std; const int maxn=105; const int inf=99999999; int c[maxn][maxn]; int dis[maxn]; int n,m,np,nc; bool bfs(){ memset(dis,-1,sizeof(dis)); queue<int>que; que.push(0); dis[0]=0; while(!que.empty()){ int num=que.front(); que.pop(); for(int i=0;i<=n;i++){ if(dis[i]==-1&&c[num][i]>0){ dis[i]=dis[num]+1; que.push(i); } } } if(dis[n]>0) return true; return false; } int find(int x,int low){ int a; if(x==n) return low; for(int i=0;i<=n;i++){ if(c[x][i]>0 &&dis[i]==dis[x]+1 &&(a=find(i,min(low,c[x][i])))){ c[x][i]-=a; c[i][x]+=a; return a; } } return 0; } int main(){ freopen("test.txt","r",stdin); int u,v,w; int ans=0; int tmp; while(~scanf("%d %d %d %d",&n,&np,&nc,&m)){ memset(c,0,sizeof(c)); n++; for(int i=0;i<m;i++){ scanf(" (%d,%d)%d",&u,&v,&w); u++; v++; c[u][v]+=w; } for(int i=0;i<np;i++){ scanf(" (%d)%d",&u,&v); u++; c[0][u]+=v; } for(int i=0;i<nc;i++){ scanf(" (%d)%d",&u,&v); u++; c[u][n]+=v; } ans=0; tmp=0; while(bfs()){ while(tmp=find(0,inf)) ans+=tmp; } printf("%d\n",ans); } return 0; }
转载请注明原文地址: https://www.6miu.com/read-74733.html

最新回复(0)