第一次写Dinic 然后贴一下 最基础的网络流问题 嘎嘎:
#include <iostream> #include<cstdio> #include<string.h> #include<queue> using namespace std; const int M=205; __int64 map[M][M]; int n,m,dist[M]; queue<int>q; void readdate() { __int64 i,a,b,c; for(i=0;i<n;i++) { scanf("%I64d%I64d%I64d",&a,&b,&c); map[a][b]+=c; } } bool BFS() { while(!q.empty()){q.pop();} int x,i; memset(dist,-1,sizeof(dist)); q.push(1); dist[1]=0; while(!q.empty()) { x=q.front(); q.pop(); for(i=1;i<=m;i++) if(dist[i]<0&&map[x][i]>0) { dist[i]=dist[x]+1; q.push(i); } } if(dist[m]==-1)return 0; else return 1; } __int64 min_vual(__int64 a,__int64 b) { return a>b?b:a; } __int64 find(int a,__int64 low) { __int64 aq,i; if(a==m)return low; for(i=1;i<=m;i++) if(dist[a]==dist[i]-1&&map[a][i]>0&&(aq=find(i,min_vual(low,map[a][i])))) { map[a][i]-=aq; map[i][a]+=aq; return aq; } return 0; } int main() { __int64 temp,ans; while(scanf("%d%d",&n,&m)==2) { ans=0; memset(map,0,sizeof(map)); readdate(); while(BFS()) { while((temp=find(1,1<<30)))ans+=temp; } printf("%I64d ",ans); } return 0; }