POJ - 1459 Power Network 最大流模版,有点意思的输入

题目链接

https://vjudge.net/problem/POJ-1459

题意

n个节点,有用电器,有发电站,有中转站,m条路线,有流量限制,求最大用电器功率

思路

不知道为什么一个最大流模板题题干这么绕人。。按m建图,s向发电站连边,权为发电量,用电器向t连边,权为最大功率,跑最大流

输入部分稍显麻烦,自己用的cin,看别人的博客学的c输入,挺巧妙的。

代码

#include<cstdio>
#include<iostream>
#include<iomanip>
#include<map>
#include<string>
#include<queue>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdlib> 
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define endl "\n"
//#define int long long
using namespace std;
	typedef long long ll;
	const int inf=0x3f3f3f3f;
	const int maxn=1010;
	const int maxe=50010;

	int head[maxn],cnt;
	struct Edge{
    
    
		int v;
		int w;
		int next;
	}edge[maxe];

	int n,n1,n2,m,k,s,t;
	ll maxflow;
	int deep[maxn];//²ã¼¶Êý£¬ÆäʵӦ¸ÃÊÇlevel
	int now[maxe];//µ±Ç°»¡ÓÅ»¯


	void init(){
    
    
		memset(head,-1,sizeof(head));//Çå¿ÕËùÓеã¶ÔÓ¦±ßµÄÁªÏµ
		cnt=0;
		maxflow=0; 
		return ;	
	}
	void add(int u,int v,int w){
    
    
	//	cout<<u<<" "<<v<<" "<<w<<endl;
  		edge[cnt].v=v;
		edge[cnt].w=w;
		edge[cnt].next=head[u];
		head[u]=cnt++;
	}

	inline bool bfs(){
    
    //ÔÚ²ÐÁ¿ÍøÂçÖй¹Ôì·Ö²ãͼ
    	memset(deep,0x3f,sizeof(deep));
    	queue<int>q;
    	q.push(s);deep[s] = 0;now[s] = head[s];//һЩ³õʼ»¯
    	while(q.size()){
    
    
        	int x = q.front();q.pop();
        	for(int i=head[x];i!=-1;i=edge[i].next){
    
    
        	    int y=edge[i].v;
         	    if(edge[i].w>0&&deep[y]==inf){
    
    //û×ß¹ýÇÒÊ£ÓàÈÝÁ¿´óÓÚ0
         	    	q.push(y);
        	        now[y]=head[y];//Ïȳõʼ»¯£¬ÔÝʱ¶¼Ò»Ñù
         	       	deep[y]=deep[x]+1;
        	        if(y==t)	return 1;//ÕÒµ½ÁË
				}
        	}
    	}
    	return 0;
	}

//flowÊÇÕûÌõÔö¹ã·¶Ô×î´óÁ÷µÄ¹±Ï×£¬restÊǵ±Ç°×îСʣÓàÈÝÁ¿£¬ÓÃrestÈ¥¸üÐÂflow
	ll dfs(int x,int flow){
    
    //ÔÚµ±Ç°·Ö²ãͼÉÏÔö¹ã
    	if(x==t)	return flow;
    	ll ans = 0,k,i;
    	for(i=now[x];i!=-1&&flow;i=edge[i].next){
    
    
        	now[x]=i;//µ±Ç°»¡ÓÅ»¯£¨±ÜÃâÖظ´±éÀú´Óx³ö·¢µÄ²»¿ÉÍØÕ¹µÄ±ß£©
        	int y=edge[i].v;
        	if(edge[i].w>0&&(deep[y]==deep[x]+1)){
    
    //±ØÐëÊÇÏÂÒ»²ã²¢ÇÒÊ£ÓàÈÝÁ¿´óÓÚ0
        	    k=dfs(y,min(flow,edge[i].w));//È¡×îС
         		if(!k)	deep[y]=inf;//¼ôÖ¦£¬È¥µôÔö¹ãÍê±ÏµÄµã
            	edge[i].w-=k;//»ØËÝʱ¸üÐÂ
            	edge[i^1].w+=k;//³É¶Ô±ä»»
            	ans+=k;
            	flow-=k;
        	}
    	}
    	return ans;
	}	

	void dinic(){
    
    
    	while(bfs())
    	    maxflow+=dfs(s,inf);
	}

	int main(){
    
    
		while(scanf("%d%d%d%d",&n,&n1,&n2,&m)==4){
    
    
	    	init();
	    	s=n+5,t=s+1;
	    	while(m--){
    
    
	    		int u,v,w;
	    		while(getchar()!='(');
	    		scanf("%d%*c%d%*c%d",&u,&v,&w);
	    		add(u,v,w);
	    		add(v,u,0);
			}
			while(n1--){
    
    
				int u,w;
				while(getchar()!='(');
				scanf("%d%*c%d",&u,&w);
	    		add(s,u,w);
	    		add(u,s,0);
			}
			while(n2--){
    
    
				int u,w;
				while(getchar()!='(');
				scanf("%d%*c%d",&u,&w);
				add(u,t,w);
	    		add(t,u,0);
			}
	    	dinic();
	    	printf("%d\n",maxflow);
		}
    	return 0;
	}

猜你喜欢

转载自blog.csdn.net/TheSunspot/article/details/108279991