zoukankan      html  css  js  c++  java
  • 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;
    }
    
  • 相关阅读:
    IP保留地址
    HTML5读取本地文件
    angularjs中动态为audio绑定src
    canvas移动端常用技巧图片loading
    angularjs三级联动
    angular实现select的ng-options
    ng-bind-html在ng-repeat中问题的解决办法
    JS判断是否在微信浏览器打开
    angular实现select的ng-options
    创建 AngularJS 自定义过滤器,带自定义参数
  • 原文地址:https://www.cnblogs.com/AaronChang/p/12129648.html
Copyright © 2011-2022 走看看