hdu 1532 Drainage Ditches(网络流)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1532

题目大意是:农夫约翰要把多个小池塘的水通过池塘间连接的水渠排出去,从池塘1到池塘M最多可以排多少的水流量,给定水渠和连接的两个小池塘,以及该水渠的流量,求最大流。

其实就是裸的最大流,源点是1号池塘,汇点是M号池塘,从1到M做一个dinic算法求出最大流就行,但是我一直WA,怎么也改不对,后来发现是因为自己喜欢用vector建边建图的原因,对于输入多组样例时,没有初始化上组样例的vector数组的数据,导致tle,wa各种错误,找了一个多小时才发现!下次记得要用clear()函数清除vector数组中的数据。

AC代码:

#include<iostream>
#include<stack>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
const int Ni = 205;
const int MAX = 0x3f3f3f3f;

struct node{
	vector<int> vex;//某个节点连接的点 
	vector<int> num;//连接节点边的序号 
}g[Ni];
struct edge{
	int u,v,c;//u起点,v终点,c流量 
}e[Ni*Ni];
int d[Ni];//深度
int N,M;
int edgenum = 0;//边的序号从0开始,
void addedge(int u,int v,int c){
	e[edgenum].u = u;
	e[edgenum].v = v;
	e[edgenum].c = c;
	g[u].vex.push_back(v);  
	g[u].num.push_back(edgenum++); 
	e[edgenum].u = v;
	e[edgenum].v = u;
	e[edgenum].c = 0;
	g[v].num.push_back(edgenum++);
	g[v].vex.push_back(u);   
}

int bfs(){
	memset(d,-1,sizeof(d));
	queue<int> q;
	q.push(1);
	d[1] = 0;
	while(!q.empty()){
		int cur = q.front() ;
		q.pop() ;
		for(int i = 0;i<g[cur].vex.size() ;i++ ){
			int now = g[cur].vex[i];
			int te = g[cur].num[i];
			if(d[now] == -1 && e[te].c > 0 ){//如果now没有访问过,且该边流量大于0 
				d[now] = d[cur] + 1;//增加深度 
				q.push(now); 
			}  
		}
	}
	return d[M]!=-1;	 
}

int dfs(int a,int b){
	int r = 0;
	
	if(a == M){
		return b;
	}
	
	for(int i = 0;i<g[a].vex.size() && r<b ;i++ ){
		int u = g[a].vex[i];
		int te = g[a].num[i];
		if(e[te].c > 0 && d[u] == d[a] + 1 ){
			int t = min(e[te].c,b - r);//求出可以流过的流量 
			t = dfs(u,t);//递归寻找增广路 
			r+=t;
			e[te].c-=t;
			e[te^1].c+=t;
		} 
	}
	if(!r){
		d[a] = -2;
	}
	return r;
}

int dinic(int sp,int tp){
	int total = 0,t;
	while(bfs()){
		while(1){
			t = dfs(sp,MAX);
			if(!t){//找不到增广路,t=0,循环终止 
				break;
			}
			total+=t;
		}
	}
	return total;
}

int main(){
	while(~scanf("%d%d",&N,&M)){
		for(int i = 0;i<N;i++){
			int u,v,C;
			scanf("%d%d%d",&u,&v,&C);
			addedge(u,v,C);
		}
	 printf("%d
",dinic(1,M));
	for(int i = 1;i<=M;i++){//!!!while输入多组样例,一定要清空vector数组内的数据! 
		g[i].num.clear() ;
		g[i].vex.clear() ;  
	}
	}
	return 0;
}
原文地址:https://www.cnblogs.com/AaronChang/p/12129648.html