poj1459 2010.2.17

来源:互联网 发布:好听的男英文歌知乎 编辑:程序博客网 时间:2024/05/21 09:49

poj1459 2010.2.17

1.       在构造的时候可以在设一个起点,把发电厂的发电量转变成起点到发电厂的容量,用电量也是类似的处理,起点和终点分别在原来的nodes数上,再加1.

2.       对于数据的特殊处理方式,先读进字符串,在用sscanf读字符串

#include <cstdio>#include <cstring>#include <queue>using namespace std;#define MAXN 400+10#define INF 1000000000int flow[MAXN][MAXN],cap[MAXN][MAXN],a[MAXN],p[MAXN];int n,s,t,m,f,np,nc;int max;void edmondskarp();void init();void doit();void edmondskarp(){queue<int> q;memset(flow,0,sizeof(flow));f=0;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;v++)if (!a[v]&&cap[u][v]>flow[u][v]){p[v]=u;q.push(v);if (a[u]<cap[u][v]-flow[u][v])a[v]=a[u];else a[v]=cap[u][v]-flow[u][v];}}if(a[t]==0) break;for(int u=t;u!=s;u=p[u]){flow[p[u]][u]+=a[t];flow[u][p[u]]-=a[t];}f+=a[t];}}void init(){int i,t1,t2,t3;char ch[400];for(i=1;i<=m;i++){scanf("%s",ch);sscanf(ch,"(%d,%d)%d",&t1,&t2,&t3);cap[t1][t2]=t3;}for(i=1;i<=np;i++){scanf("%s",ch);sscanf(ch,"(%d)%d",&t1,&t2);cap[s][t1]=t2;}for(i=1;i<=nc;i++){scanf("%s",ch);sscanf(ch,"(%d)%d",&t1,&t2);cap[t1][t]=t2;}//for(i=1;i<=n;i++)//{//for(j=1;j<=n;j++)//printf("%5d",cap[i][j]);//printf("\n");//}//for(i=1;i<=np;i++)//printf("%5d %5d\n",sta[i][1],sta[i][2]);//printf("\n");//for(i=1;i<=nc;i++)//printf("%5d %5d\n",end[i][1],end[i][2]);}int main(){while (scanf("%d %d %d %d",&n,&np,&nc,&m)!=EOF){memset(cap,0,sizeof(cap));s=n;n++;t=n;init();edmondskarp();printf("%d\n",f);}//printf("\n");//for(i=1;i<=n;i++)//printf("%d    %d\n",i,a[i]);return 0;}


0 0