第一次写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\n",ans);}return 0;
}