首页 > 代码库 > POJ1459:Power Network(dinic)
POJ1459:Power Network(dinic)
题目链接:http://poj.org/problem?id=1459
题意:有n个结点,np个发电站,nc个消费者,m个电力运输线。接下去是m条边的信息(u,v)cost,cost表示边(u,v)的最大流量;a个发电站的信息(u)cost,cost表示发电站u能提供的最大流量;b个用户的信息(v)cost,cost表示每个用户v能接受的最大流量。
思路:在图中添加1个源点S和汇点T,将S和每个发电站相连,边的权值是发电站能提供的最大流量;将每个用户和T相连,边的权值是每个用户能接受的最大流量。从而转化成了一般的最大网络流问题,然后求解。
#include <iostream>#include <stdio.h>#include <string.h>#include <algorithm>#include <queue>#include <math.h>#define N 1100#define inf 0x3f3f3f3ftypedef int ll;using namespace std;ll n,np,nc,m,tt,dis[N],head[N];struct node{ ll x,y,w,next;} eg[N*N];void init(){ tt=0; memset(head,-1,sizeof(head));}void add(int xx,int yy,int ww){ eg[tt].x=xx; eg[tt].y=yy; eg[tt].w=ww; eg[tt].next=head[xx]; head[xx]=tt++; eg[tt].x=yy; eg[tt].y=xx; eg[tt].w=0; eg[tt].next=head[yy]; head[yy]=tt++;}bool bfs(int s,int e){ memset(dis,-1,sizeof(dis)); dis[s]=0; queue<int>q; q.push(s); while(!q.empty()) { int fa=q.front(); q.pop(); for(int i=head[fa]; i!=-1; i=eg[i].next) { int v=eg[i].y; if(dis[v]==-1&&eg[i].w) { dis[v]=dis[fa]+1; q.push(v); } } } if(dis[e]>0) return true; return false;}int dinic(int s,int maxt){ if(s==n+1) return maxt; int a,sum=maxt; for(int i=head[s]; i!=-1; i=eg[i].next) { int v=eg[i].y; if(dis[v]==dis[s]+1&&eg[i].w>0) { a=dinic(v,min(sum,eg[i].w)); eg[i].w-=a; eg[i+1].w+=a; sum-=a; } } return maxt-sum;}int main(){ ll xx,yy,ww; while(scanf("%d%d%d%d",&n,&np,&nc,&m)!=EOF) { init(); while(m--) { while(getchar()!=‘(‘) ; scanf("%d,%d)%d",&xx,&yy,&ww); add(xx+1,yy+1,ww); } for(int i=0; i<np; i++) { while(getchar()!=‘(‘) ; scanf("%d)%d",&xx,&yy); add(0,xx+1,yy); } for(int i=0; i<nc; i++) { while(getchar()!=‘(‘) ; scanf("%d)%d",&xx,&yy); add(xx+1,n+1,yy); } ll ans=0; while(bfs(0,n+1)) { ans+=dinic(0,inf); } printf("%d\n",ans); } return 0;}
POJ1459:Power Network(dinic)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。