題目 http://acm.hdu.edu.cn/showproblem.php?pid=1532
這是最大流的一個簡單題哦 我是用Edmond-Karp來做的哦 思想是每次找出一條最短路,然後在這條最短路裡找出一條邊最小的權值哦,
這條路上的邊全都都減去最小權值,也是更新哦。重複上述過程,直到沒有最短路徑出現哦。。。
具體看代碼
#include<iostream>#include<cstring>#include<cstdio>#include<queue>using namespace std;#define max 201int map[max][max];int p[max];int n,m;bool ek_bfs() //不斷尋找最短路哦{ queue<int> que; bool flag[max]; memset(flag,false,sizeof(flag)); //標記哦 memset(p,-1,sizeof(p)); //記錄 que.push(1); flag[1]=true; while(!que.empty()) { int e=que.front(); if(e==m) return true; que.pop(); for(int i=1;i<=m;i++) { if(map[e][i]&&!flag[i]) { flag[i]=true; p[i]=e; que.push(i); //入隊 } } } return false;}void ek_max_flow(){ int u,flow_ans=0,mn; while(ek_bfs()) { mn=9999999; u=m; while(p[u]!=-1) //找出最小的那條路哦 { mn=mn>map[p[u]][u]?map[p[u]][u]:mn; u=p[u]; } flow_ans+=mn; u=m; while(p[u]!=-1) //更新哦 { map[p[u]][u]-=mn; map[u][p[u]]+=mn; u=p[u]; } } cout<<flow_ans<<endl;}int main(){ int i,j,t; while(cin>>n>>m) { memset(map,0,sizeof(map)); while(n--) { cin>>i>>j>>t; map[i][j]+=t; } ek_max_flow(); } return 0;}