POJ 1459 Power Network 最大流水题

来源:互联网 发布:backtrack5软件下载 编辑:程序博客网 时间:2024/06/06 05:20

sap模板题,输入比较麻烦,漏了个分号检查了半天

View Code
#include<stdio.h>#include<string.h>#include<algorithm>#define maxn 105#define INF 100000000using namespace std;int c[maxn][maxn],dis[maxn],num[maxn];int pre[maxn];int s, t, vs;int n, m, np,nc;void sap(){    memset(dis,0,sizeof(dis));    memset(num,0,sizeof(num));    vs=n+2;num[0]=vs;    int u = pre[s]=s,maxf=0,aug=INF,v;    while(dis[s] < vs)    {loop:    for(v=0;v<vs;v++)         {             if(c[u][v]>0&&dis[u]==dis[v]+1)             {                 aug = min(aug,c[u][v]);                 pre[v] = u;                 u = v;                 if(u == t)                 {                     for(u=pre[u];v!=s;v=u,u=pre[u])                     {                         c[u][v] -= aug;                         c[v][u] += aug;                     }                     maxf += aug;                     aug = INF;                 }                 goto loop;             }         }         int mind=vs;         for(v=0;v<vs;v++)         {             if(c[u][v]>0&&mind>dis[v])             {                 mind=dis[v];             }         }         if(!(--(num[dis[u]])))break;         ++num[dis[u]=mind+1];         u=pre[u];    }    printf("%d\n",maxf);}int main(){    int x, y, z;    while(~scanf("%d%d%d%d",&n,&np,&nc,&m))    {        int i=0;        s=n;t=n+1;        memset(c,0,sizeof(c));        while(i<m)        {            while(getchar()!='(');//漏个分号伤不起啊            scanf("%d,%d)%d",&x, &y, &z);            c[x][y]+=z;            i++;        }        i=0;        while(i<np)        {            while(getchar()!='(');//漏个分号伤不起啊            scanf("%d)%d",&y,&z);            c[s][y]+=z;            i++;        }        i=0;        while(i<nc)        {            while(getchar()!='(');//漏个分号伤不起啊            scanf("%d)%d",&y,&z);            c[y][t] +=z;            i++;        }        sap();    }    return 0;}

 

View Code
#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;#define maxn 105#define maxm 10005#define inf 1000000000int min(int a, int b){    return a < b ? a : b;}struct E{    int v, next, c;}edge[maxm << 2];int head[maxn], tot;int n, m, np, nc;void add(int s, int t, int c){    edge[tot].v = t;    edge[tot].c = c;    edge[tot].next = head[s];    head[s] = tot++;    edge[tot].v = s;    edge[tot].c = 0;    edge[tot].next = head[t];    head[t] = tot++;}void init(){    tot = 0;    memset(head, -1, sizeof(head));}int gap[maxn], dis[maxn], pre[maxn], cur[maxn];int sap(int s, int t, int vs){    memset(gap, 0, sizeof(gap));    memset(dis, 0, sizeof(dis));    gap[0] = vs;    memcpy(cur, head, sizeof(head));    int i, u = pre[s] = s, maxf = 0, aug = inf, v;    while(dis[s] < vs)    {loop:   for(i = head[u]; i != -1; i = edge[i].next)        {            v = edge[i].v;            if(edge[i].c > 0 && dis[u] == dis[v] + 1)            {                aug = min(aug, edge[i].c);                pre[v] = u;                cur[u] = i;                u = v;                if(u == t)                {                    for(u = pre[u]; v != s; v = u, u = pre[u])                    {                        edge[cur[u]].c -= aug;                        edge[cur[u]^1].c += aug;                    }                    maxf += aug;                    aug = inf;                }                goto loop;            }        }        int min_d = vs;        for(i = head[u]; i != -1; i = edge[i].next)        {            v = edge[i].v;            if(edge[i].c > 0 && dis[v] < min_d)                min_d = dis[v];        }        if( !(--gap[dis[u]])) break;        ++gap[dis[u] = min_d + 1];        u = pre[u];    }    return maxf;}int main(){    int i, j;    while( ~scanf("%d%d%d%d", &n, &np, &nc, &m))    {        int S = n, T = n+1;        init();        while(m--)        {            int x, y, z;            while( getchar() != '(');            scanf("%d,%d)%d", &x, &y, &z);            add(x, y ,z);        }        i = 0;        while(np--)        {            int x, y;            while( getchar() != '(');            scanf("%d)%d", &x, &y);            add(S, x, y);        }        while(nc--)        {            int x, y;            while( getchar() != '(');            scanf("%d)%d", &x, &y);            add(x, T, y);        }        printf("%d\n", sap(S, T, n+2));    }    return 0;}

 

原创粉丝点击