poj 1459 Power Network sap + gap

来源:互联网 发布:2016年淘宝99大促时间 编辑:程序博客网 时间:2024/06/15 14:36
# include<stdio.h># include<iostream># define M 666using namespace std;const int inf=2100000000;int n,nb,nc,m;int flow[M][M];//邻接矩阵 int source,end,s,t;//源点,汇点 int sap(){int gap[M];//标号为i节点的数量 int dist[M];//标号 int cur[M];//当前弧 int pre[M]; //当前流路径中前驱 s=source;t=end;memset(cur,0,sizeof(cur));memset(dist,0,sizeof(dist));memset(gap,0,sizeof(gap));int u=pre[s]=s;//u代表当前节点 int maxflow=0,aug=inf;//maxflow代表最大流,aug代表当前流 gap[0]=n;while(dist[s]<n){int flagloop=0; for(int v=cur[u];v<n;v++)if(flow[u][v]&&dist[u]==dist[v]+1){flagloop=1;cur[u]=v;aug=min(aug,flow[u][v]);pre[v]=u;u=v;if(v==t){maxflow+=aug;for(u=pre[u];v!=s;v=u,u=pre[u])flow[u][v]-=aug,flow[v][u]+=aug;aug=inf;}if(flagloop==1)break;}if(flagloop==1)continue; int mind=n;for(int v=0;v<n;v++)if(flow[u][v]&&(mind>dist[v])){cur[u]=v;mind=dist[v];}if((--gap[dist[u]])==0) break;gap[dist[u]=mind+1]++;u=pre[u];}return maxflow;}int main(){int x,y,c;while(~scanf("%d%d%d%d",&n,&nb,&nc,&m)){memset(flow,0,sizeof(flow));source=0;end=n+1;for(int i=0;i<m;i++){while(getchar()!='(');scanf("%d,%d)%d",&x,&y,&c);flow[x+1][y+1]+=c;}for(int i=0;i<nb;i++){while(getchar()!='(');scanf("%d)%d",&x,&c);flow[source][x+1]+=c;}for(int i=0;i<nc;i++){while(getchar()!='(');scanf("%d)%d",&x,&c);flow[x+1][end]+=c;}n+=2;printf("%d\n",sap());}return 0;}

原创粉丝点击