#include<iostream>
#include<queue>
using namespace std;
#define MAX_N 205
#define MAX_M 205
const int INF=0x7fffffff;
int map[MAX_M][MAX_M],pre[MAX_M];
//int flow[MAX_M];
int s,e,c,n,m;
int bfs();
int EDmonds_Karp();
int main()
{
while(scanf("%d%d",&n,&m)!=EOF){
memset(map,0,sizeof(map));
while(n--){
scanf("%d %d %d",&s,&e,&c);
map[s][e]+=c;
}
s=1;e=m;
printf("%d\n",EDmonds_Karp());
}
return 0;
}
int EDmonds_Karp()
{
int max_flow=0,cur,min;
while((min=bfs())!=-1){ //找增广路径,找到,则构造残余网络
max_flow+=min;
for(cur=e;cur!=s;cur=pre[cur]){
map[pre[cur]][cur]-=min; //更新正向边的实际流量
map[cur][pre[cur]]+=min; //添加反向边
}
}
return max_flow;
}
int bfs()
{
int i,tmp,min;
queue<int>q; //保存优先扩展出来的顶点的队列
// while(!q.empty()) q.pop();
memset(pre,-1,sizeof(pre)); //pre数组存储当前已访问过结点的增广路径
pre[s]=0;
// flow[s]=INF; //flow数组存储一次BFS遍历之后流的可改进量
q.push(s);
while(!q.empty()){
tmp=q.front();q.pop();
if(tmp==e) { //增广路径找到
// break;
min=INF;
for(i=e;i!=s;i=pre[i])
min=map[pre[i]][i]<min?map[pre[i]][i]:min;
return min;
}
for(i=1;i<=e;i++){
if(i!=s&&pre[i]==-1&&map[tmp][i]){ //检测到一个顶点未访问且允许流量增加
// flow[i]=flow[tmp]<map[tmp][i]?flow[tmp]:map[tmp][i];
q.push(i);
pre[i]=tmp;
}
}
}
return -1;
// if(pre[e]==-1) return -1;
// return flow[e];
}
题目地址:http://acm.pku.edu.cn/JudgeOnline/problem?id=1273
#include<queue>
using namespace std;
#define MAX_N 205
#define MAX_M 205
const int INF=0x7fffffff;
int map[MAX_M][MAX_M],pre[MAX_M];
//int flow[MAX_M];
int s,e,c,n,m;
int bfs();
int EDmonds_Karp();
int main()
{
while(scanf("%d%d",&n,&m)!=EOF){
memset(map,0,sizeof(map));
while(n--){
scanf("%d %d %d",&s,&e,&c);
map[s][e]+=c;
}
s=1;e=m;
printf("%d\n",EDmonds_Karp());
}
return 0;
}
int EDmonds_Karp()
{
int max_flow=0,cur,min;
while((min=bfs())!=-1){ //找增广路径,找到,则构造残余网络
max_flow+=min;
for(cur=e;cur!=s;cur=pre[cur]){
map[pre[cur]][cur]-=min; //更新正向边的实际流量
map[cur][pre[cur]]+=min; //添加反向边
}
}
return max_flow;
}
int bfs()
{
int i,tmp,min;
queue<int>q; //保存优先扩展出来的顶点的队列
// while(!q.empty()) q.pop();
memset(pre,-1,sizeof(pre)); //pre数组存储当前已访问过结点的增广路径
pre[s]=0;
// flow[s]=INF; //flow数组存储一次BFS遍历之后流的可改进量
q.push(s);
while(!q.empty()){
tmp=q.front();q.pop();
if(tmp==e) { //增广路径找到
// break;
min=INF;
for(i=e;i!=s;i=pre[i])
min=map[pre[i]][i]<min?map[pre[i]][i]:min;
return min;
}
for(i=1;i<=e;i++){
if(i!=s&&pre[i]==-1&&map[tmp][i]){ //检测到一个顶点未访问且允许流量增加
// flow[i]=flow[tmp]<map[tmp][i]?flow[tmp]:map[tmp][i];
q.push(i);
pre[i]=tmp;
}
}
}
return -1;
// if(pre[e]==-1) return -1;
// return flow[e];
}