UVa 10330 Power Transmission (最大流+多源多汇点+结点容量(拆点))

来源:互联网 发布:生命电视台网络直播 编辑:程序博客网 时间:2024/06/05 22:43

题意:一张有向图由n个点构成,每个点都有一个容量限制,然后给出多个源点和多个汇点。

#include<cstdio>#include<cmath>#include<algorithm>#include<iostream>#include<climits>#include<cstring>#include<string>#include<set>#include<map>#include<queue>#include<vector>using namespace std;const int INF=1000000000;const int maxn=100+100+10;int n,m;int B,D;int flow[maxn][maxn];int cap[maxn][maxn];int a[maxn];int p[maxn];int EK(){queue<int> q;memset(flow,0,sizeof(flow));int f=0,s=0,t=n+n+1;for(;;){memset(a,0,sizeof(a));a[s]=INF;q.push(s);while(!q.empty()){int u=q.front();q.pop();for(int v=0;v<=n+n+1;v++)if(!a[v]&&cap[u][v]>flow[u][v]){p[v]=u;q.push(v);a[v]=min(a[u],cap[u][v]-flow[u][v]);}}if(a[t]==0)break;for(int u=n+n+1;u!=0;u=p[u]){flow[p[u]][u]+=a[t];flow[u][p[u]]-=a[t];}f+=a[t];}return f;}int main(){while(~scanf("%d",&n)){memset(cap,0,sizeof(cap));for(int i=1;i<=n;i++){int c;scanf("%d",&c);cap[i][n+i]=c;}scanf("%d",&m);for(int i=0;i<m;i++){int u,v,c;scanf("%d%d%d",&u,&v,&c);cap[u+n][v]=c;}scanf("%d%d",&B,&D);for(int i=0;i<B;i++){int v;scanf("%d",&v);cap[0][v]=INF;}for(int i=0;i<D;i++){int v;scanf("%d",&v);cap[v+n][n+n+1]=INF;}printf("%d\n",EK());}return 0;}


0 0
原创粉丝点击