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;}

原创粉丝点击