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(' '); } return 0; }