poj1459Power Network
Time Limit: 2000MS | Memory Limit: 32768K | |
Total Submissions: 24159 | Accepted: 12596 |
Description
An example is in figure 1. The label x/y of power station u shows that p(u)=x and pmax(u)=y. The label x/y of consumer u shows that c(u)=x and cmax(u)=y. The label x/y of power transport line (u,v) shows that l(u,v)=x and lmax(u,v)=y. The power consumed is Con=6. Notice that there are other possible states of the network but the value of Con cannot exceed 6.
Input
Output
Sample Input
2 1 1 2 (0,1)20 (1,0)10 (0)15 (1)20 7 2 3 13 (0,0)1 (0,1)2 (0,2)5 (1,0)1 (1,2)8 (2,3)1 (2,4)7 (3,5)2 (3,6)5 (4,2)7 (4,3)5 (4,5)1 (6,0)5 (0)5 (1)2 (3)2 (4)1 (5)4
Sample Output
15 6
Hint
Source
题意:
给几个发电站,给几个消耗站,再给几个转发点。
发电站只发电,消耗站只消耗电,发电站跟发电站,发电站跟消耗站可以连线,再给各个传送线的传电能力。
问你消耗站能获得的最多电是多少。
增加一个超级源点,和超级汇点。。把所给的发电站都和超级源点相连,把所给的消耗战都和超级汇点相连
Dinic
#include<map> #include<string> #include<cstring> #include<cstdio> #include<cstdlib> #include<cmath> #include<queue> #include<vector> #include<iostream> #include<algorithm> #include<bitset> #include<climits> #include<list> #include<iomanip> #include<stack> #include<set> using namespace std; int head[210],tail; struct Edge { int from,to,cap,flow,next; }edge[40010]; void add(int from,int to,int cap,int flow) { edge[tail].to=to; edge[tail].cap=cap; edge[tail].flow=flow; edge[tail].next=head[from]; head[from]=tail++; } int dis[210],ed; bool vis[210]; bool bfs() { memset(vis,0,sizeof(vis)); queue<int>qq; qq.push(0); dis[0]=0; vis[0]=1; while(qq.size()) { int from=qq.front(); qq.pop(); for(int i=head[from];i!=-1;i=edge[i].next) { int to=edge[i].to; if(!vis[to]&&edge[i].cap>edge[i].flow) { vis[to]=1; dis[to]=dis[from]+1; qq.push(to); } } } return vis[ed]; } int cur[210]; int dfs(int from,int mn) { if(from==ed||mn==0) return mn; int ans=0,f; for(int &i=cur[from];i!=-1;i=edge[i].next) { int to=edge[i].to,cap=edge[i].cap,flow=edge[i].flow; if(dis[from]+1==dis[to]&&(f=dfs(to,min(mn,cap-flow)))>0) { edge[i].flow+=f; edge[i^1].flow-=f; ans+=f; mn-=f; if(mn==0) break; } } return ans; } int maxflow() { int ans=0; do { for(int i=0;i<=ed;i++) cur[i]=head[i]; ans+=dfs(0,INT_MAX); }while(bfs()); return ans; } char s[100]; int main() { int n,np,nc,m; while(scanf("%d%d%d%d",&n,&np,&nc,&m)!=EOF) { tail=0; memset(head,-1,sizeof(head)); while(m--) { int from,to,v; scanf("%s",s); sscanf(s,"(%d,%d)%d",&from,&to,&v); add(from+1,to+1,v,0); add(to+1,from+1,0,0); } while(np--) { int x,v; scanf("%s",s); sscanf(s,"(%d)%d",&x,&v); scanf("(%d)%d",&x,&v); add(0,x+1,v,0); add(x+1,0,0,0); } ed=n+1; while(nc--) { int x,v; scanf("%s",s); sscanf(s,"(%d)%d",&x,&v); scanf("(%d)%d",&x,&v); add(x+1,ed,v,0); add(ed,x+1,0,0); } printf("%d\n",maxflow()); } }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。