题目网址:http://acm.hdu.edu.cn/showproblem.php?pid=1532
思路:
网络流最大流的入门题,直接套模板即可~ 注意坑点是:有重边!!读数据的时候要用“+=”替换“=”。
对网络流不熟悉的,给一篇讲解:http://www.cnblogs.com/ZJUT-jiangnan/p/3632525.html。 ?(? ? ??)我是看这篇博客才入门的。
代码:
1 #include <cstdio> 2 #include <cstring> 3 #include <queue> 4 #include <algorithm> 5 using namespace std; 6 const int inf=10000005; 7 int n,m; 8 int mp[205][205]; 9 int vis[205]; 10 int pre[205]; 11 void update(int s,int t,int Min){ 12 int k=t; 13 while (pre[k]!=-1) { 14 mp[k][pre[k]]+=Min; 15 mp[pre[k]][k]-=Min; 16 k=pre[k]; 17 } 18 } 19 int bfs(int s,int t){ 20 int Min=inf; 21 memset(vis, 0, sizeof(vis)); 22 memset(pre, -1, sizeof(pre)); 23 queue<int>q; 24 q.push(s); 25 vis[s]=1; 26 while (!q.empty()) { 27 int x=q.front();q.pop(); 28 for (int i=1; i<=n; i++) { 29 if (!vis[i] && mp[x][i]>0) { 30 pre[i]=x; 31 Min=min(mp[x][i], Min); 32 q.push(i); 33 vis[i]=1; 34 } 35 } 36 if(pre[t]!=-1) return Min; 37 } 38 return 0; 39 } 40 int edmonds_karp(int s,int t){ 41 int Min=-1; 42 int Max=0; 43 while(Min!=0){ 44 Min=bfs(s, t); 45 update(s,t,Min); 46 Max+=Min; 47 } 48 return Max; 49 } 50 int main(){ 51 while (scanf("%d%d",&n,&m)!=EOF) { 52 memset(mp, 0, sizeof(mp)); 53 for (int i=0; i<n; i++) { 54 int x,y,z; 55 scanf("%d%d%d",&x,&y,&z); 56 mp[x][y]+=z;//注意!! 57 } 58 printf("%d\n",edmonds_karp(1, m)); 59 } 60 return 0; 61 }
时间: 2024-10-07 04:17:26