题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1532
第一个网络流吧!在打代码之前大家讨论了,而且老师还讲了这个知识点,打的时候还是出了一些问题。就是那个逆序和顺序没有区分,就进入了死循环。
其实感觉就是深搜加修改权值。
AC代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
int q[208][208];
int r[208],t[208]; //t数组标记数组,r数组保存前驱。
int n,m;
int bfs(){
queue<int >e;
int d=1;
memset(r,0,sizeof(r));
memset(t,0,sizeof(t));
e.push(d);
r[1]=1;
while(!e.empty()){ // printf("_____1\n");
int f=e.front();
e.pop();
if( f == m ) return 1;
for(int i=1;i<=m;i++){
if( r[i] == 0 && q[f][i] != 0){
r[i]=1;
t[i]=f;
d=i;
// cout<<t[i]<<endl;
e.push(d);
}
}
}
// printf("_____2\n");
return 0;
}
int gets(){
int ll=99999999;
int g=m;
while( g != 1){
ll=min(ll,q[t[g]][g]); //注意逆序和顺序的区别。。。
g=t[g];
}
g=m;
while( g != 1){ //修改权值,注意顺序和逆序都要修改
q[g][t[g]]+=ll;
q[t[g]][g]-=ll;
g=t[g];
}
return ll;
}
int main(){
int a,b,c;
int i,sum;
while(~scanf("%d%d",&n,&m)){
sum=0;
memset(q,0,sizeof(q));
for(i=1;i<=n;i++){
scanf("%d%d%d",&a,&b,&c);
q[a][b]+=c;
}
while(bfs()){
sum+=gets();
}
printf("%d\n",sum);
}
return 0;
}
路途中。。。。