poj 1459 Power Network
来源:互联网 发布:java设计界面美观 编辑:程序博客网 时间:2024/05/07 19:44
本题的关键在于理解题意和建图,先设置一个超级源点,再建一个超级汇点,在超级源点和生产者之间建边,在消费者和超级汇点之间建边,用户连接汇点的边为该用户耗电量,数据的输入比较恶心,题目还是很简单的。#include<stdio.h>#include<cmath>#include<iostream>#include<string.h>#define maxn 105int pre[maxn],queue[maxn],map[maxn][maxn];int n,m,np,nc,flow[maxn],start,end,tot,ans;using namespace std;int bfs(){ int p=0,q=1; queue[1]=0; flow[start]=100000000; memset(pre,-1,sizeof(pre)); while(p<q) { int s=queue[++p]; for(int i=1;i<=end;i++) { if(pre[i]==-1&&map[s][i]>0) { pre[i]=s; flow[i]=min(flow[s],map[s][i]); queue[++q]=i; if(i==end) return flow[end]; } } } return -1;}int Edmonds_Karp(){ int p; while((ans=bfs())!=-1) { tot+=ans; int t=end; while(t!=start) { p=pre[t]; map[p][t]-=ans; map[t][p]+=ans; t=pre[t]; } } return tot;}int main(){ while(scanf("%d%d%d%d",&n,&np,&nc,&m)!=EOF) { int u,v,z,i; memset(map,0,sizeof(map)); char temp[20]; tot=0; for(i=0;i<m;i++) { scanf("%s",temp); sscanf(temp,"(%d,%d)%d",&u,&v,&z); map[u+1][v+1]=z; } for(i=0;i<np;i++) { scanf("%s",temp); sscanf(temp,"(%d)%d",&u,&z); map[0][u+1]=z; } for(i=0;i<nc;i++) { scanf("%s",temp); sscanf(temp,"(%d)%d",&u,&z); map[u+1][n+1]=z; } start=0,end=n+1; printf("%d\n",Edmonds_Karp()); } return 0;}