最大流KK算法
#include<iostream> #include<stdio.h> #include<string.h> #include<math.h> #include<algorithm> #define MAX 0x3f3f3f3f using namespace std; int map[300][300]; int pre[300]; int n,m; int DFS(int s, int t, int f) { if(s==t) return f;//找到终点了,此时剩下的流量就是能获得的流量 for(int i=1; i<=n; i++) { if(map[s][i]>0 && pre[i]==0)//从s开始找 { pre[i]=1; int d=DFS(i,t,min(f,map[s][i]));//问有没有增广路 if(d>0) { map[s][i] -= d; map[i][s] += d; return d; } } } return 0; } int KK(int s, int t) { int maxflow=0; while(true) { memset(pre, 0, sizeof(pre)); int f= DFS(s,t,MAX);//不断找s到t的增广路 if(f == 0) return maxflow; //找不到了就回去 maxflow += f;//找到一个流量f的就赚了 } } int main() { while(~scanf("%d %d", &m, &n)) { memset(map,0,sizeof(map)); int a,b,c; for(int i=1; i<=m; i++) { scanf("%d %d %d", &a, &b, &c); map[a][b] += c; } int ans=KK(1,n); printf("%d ", ans); } return 0; }