poj1459
Posted starve
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了poj1459相关的知识,希望对你有一定的参考价值。
http://poj.org/problem?id=1459
题意:多组测试数据,每组测试数据给出N,Np,Nc,M。N代表结点数量,M代表边的数量,Np代表结点中电站的数量(只产电,不耗电),Nc代表消费者数量(只耗电,不产电),其他结点代表中转站(不产电,不耗电)。
接着M组(u,v)w数据,代表u到v容量为w,接着Np组(u)w,代表结点u产电w,接着Nc组(u)w,代表结点u耗电w。
求电网中能消耗的最大电能值。
#include<iostream> #include<cstring> #include<cstdio> #include<algorithm> #include<queue> using namespace std; inline int read() int sum=0,x=1; char ch=getchar(); while(ch<‘0‘||ch>‘9‘) if(ch==‘-‘) x=0; ch=getchar(); while(ch>=‘0‘&&ch<=‘9‘) sum=(sum<<1)+(sum<<3)+(ch^48),ch=getchar(); return x?sum:-sum; inline void write(int x) if(x<0) putchar(‘-‘),x=-x; if(x>9) write(x/10); putchar(x%10+‘0‘); const int M=105; const int N=20500; const int inf=0x3f3f3f3f; struct node int v,w,nextt; e[N]; int tot,s,t,n,np,nc,m; int deep[M],cur[M],head[M]; void addedge(int u,int v,int w) e[tot].v=v; e[tot].w=w; e[tot].nextt=head[u]; head[u]=tot++; e[tot].v=u; e[tot].w=0; e[tot].nextt=head[v]; head[v]=tot++; bool bfs() for(int i=0;i<=t;i++) deep[i]=0; queue<int>que; que.push(s); deep[s]=1; while(!que.empty()) int u=que.front(); que.pop(); for(int i=head[u];~i;i=e[i].nextt) int v=e[i].v; if(e[i].w>0&&deep[v]==0) deep[v]=deep[u]+1; if(v==t) return true; que.push(v); return deep[t]!=0; int dfs(int u,int fl) if(u==t) return fl; int x=0,ans=0; for(int i=cur[u];~i;i=e[i].nextt) int v=e[i].v; if(e[i].w>0&&deep[v]==deep[u]+1) int x=dfs(v,min(fl-ans,e[i].w)); e[i].w-=x; e[i^1].w+=x; if(e[i].w) cur[u]=i; ans+=x; if(ans==fl) return ans; if(ans==0) deep[u]=0; return ans; int dinic() int ans=0; while(bfs()) for(int i=0;i<=t;i++) cur[i]=head[i]; ans+=dfs(s,inf); return ans; void init() tot=0;s=0,t=n+1; for(int i=0;i<=t;i++) head[i]=-1; int main() while(~scanf("%d%d%d%d",&n,&np,&nc,&m)) init(); int u,v,w; while(m--) while(getchar()!=‘(‘); scanf("%d,%d)%d",&u,&v,&w); u++,v++; addedge(u,v,w); while(np--) while(getchar()!=‘(‘); scanf("%d)%d",&v,&w); v++; addedge(s,v,w); // cout<<"!!"<<endl; while(nc--) while(getchar()!=‘(‘); scanf("%d)%d",&u,&w); u++; addedge(u,t,w); write(dinic()); putchar(‘\n‘); return 0;
以上是关于poj1459的主要内容,如果未能解决你的问题,请参考以下文章