poj 1459 Power Network SAP

原创 2015年11月18日 17:17:55

SAP的模板题,主要是输入有点难处理,看有人用sscanf函数处理的,我是直接对字符串进行处理的。

对于SAP:其实核心思想就是高度函数,把它搞懂SAP其实和EK算法本质上是一样的。

还有一个重要的是GAP优化,即当高度出现断层时算法结束。


#include<stdio.h>
#include<string.h>

const int N = 128;
const int INF = 0x3f3f3f3f;

struct Edge {
    int v, next;
    int c;
};
Edge edge[N*N<<2];
int h[N], numh[N], pre[N], curEdge[N];
int n, np, nc, m, cnt;
int fir[N];

void init() {
    cnt = 0;
    memset(fir, -1, sizeof(fir));
}

void addEdge(int u, int v, int c) {
    edge[cnt].v = v;
    edge[cnt].c = c;
    edge[cnt].next = fir[u];
    fir[u] = cnt++;
}

int SAP(int s, int e) {
    memset(h, 0, sizeof(h));
    memset(numh, 0, sizeof(numh));
    memset(pre, -1, sizeof(pre));
    for(int i = 0; i < n; i++)
        curEdge[i] = fir[i];
    numh[0] = n;
    int i;
    int cur = s, pos, mmin, maxflow = 0;
    while(h[s] < n) {
        if(cur == e) {
            mmin = INF;
            for(i = s; i != e; i = edge[curEdge[i]].v) {
                if(mmin > edge[curEdge[i]].c) {
                    mmin = edge[curEdge[i]].c;
                    pos = i;
                }
            }
;           for(i = s; i != e; i = edge[curEdge[i]].v) {
                edge[curEdge[i]].c -= mmin;
                edge[curEdge[i]^1].c += mmin;
            }
            maxflow += mmin;
            cur = pos;
        }
        for(i = curEdge[cur]; i != -1; i = edge[i].next)
            if(edge[i].c && h[cur] == h[edge[i].v] + 1)
                break;
        if(i != -1) {
            curEdge[cur] = i;
            pre[edge[i].v] = cur;
            cur = edge[i].v;
        } else {
            if(--numh[h[cur]] == 0) break;
            mmin = n;
            curEdge[cur] = fir[cur];
            for(i = fir[cur]; i != -1; i = edge[i].next) {
                if(edge[i].c && h[edge[i].v] < mmin)
                    mmin = h[edge[i].v];
            }
            h[cur] = mmin + 1;
            numh[h[cur]] ++;
            if(cur != s) cur = pre[cur];
        }
    }
    return maxflow;
}

int main() {

    char in[16];
    while(~scanf("%d%d%d%d", &n, &np, &nc, &m)) {
        int a, b, c;
        init();
        for(int i = 0; i < m; i++) {
            scanf("%s", in);
            a = b = c = 0;
            int bas = 1;
            int len = strlen(in);
            while(in[--len] != ')') {
                c += (in[len] - '0') * bas;
                bas *= 10;
            }
            bas = 1;
            while(in[--len] != ',') {
                b += (in[len] - '0') * bas;
                bas *= 10;
            }

            bas = 1;
            while(in[--len] != '(') {
                a += (in[len] - '0') * bas;
                bas *= 10;
            }
            addEdge(a, b, c);
            addEdge(b, a, 0);
        }
        for(int i = 0; i < np; i++) {
            scanf("%s", in);
            a = c = 0;
            int len = strlen(in);
            int bas = 1;
            while(in[--len] != ')') {

                c += (in[len] - '0') * bas;
                bas *= 10;
            }
            bas = 1;
            while(in[--len] != '(') {
                a += (in[len] - '0') * bas;
                bas *= 10;
            }
            addEdge(n, a, c);
            addEdge(a, n, 0);
        }
        for(int i = 0; i < nc; i++) {
            scanf("%s", in);
            a = c = 0;
            int len = strlen(in);
            int bas = 1;
            while(in[--len] != ')') {
                c += (in[len] - '0') * bas;
                bas *= 10;
            }
            bas = 1;
            while(in[--len] != '(') {
                a += (in[len] - '0') * bas;
                bas *= 10;
            }
            addEdge(a, n+1, c);
            addEdge(n+1, a, 0);
        }
        n += 2;
        printf("%d\n", SAP(n-2, n-1));
    }
    return 0;
}


版权声明:本文作者Pekary:http://blog.csdn.net/u012576214,转载请注明出处。

poj 1459 Power Network(网络流_最大流)

题目链接:http://poj.org/problem?id=1459 Power Network Time Limit: 2000MS   Memor...
  • qq_34287501
  • qq_34287501
  • 2017年03月04日 17:31
  • 153

poj1459多源点网络流入门

poj1459多源点网络流入门 题目链接:http://poj.org/problem?id=1459 题目部分 题意: 简单的说下题意(按输入输出来讲,前面的描述一堆的rubbish,还用来误导人...
  • u012171516
  • u012171516
  • 2015年10月17日 11:05
  • 1103

poj 1459 Power Network, 最大流,多源多汇

点击打开链接  多源多汇最大流,虚拟一个源点s'和一个汇点t',原来的源点、汇点向它们连边。 #include #include #include #include #include #i...
  • yew1eb
  • yew1eb
  • 2014年08月01日 21:12
  • 1709

POJ 1459 Power Network【多源汇点最大流】

题意:总共N个点,np个源点,nc个汇点,nl条边,求最大流。 建立个超级源,超级汇点就行了,注意下题目给的是0-n-1下标,手动加1无压力。 输入N,NP,NC,NL,然后NL个边,NP个源点,...
  • u012469987
  • u012469987
  • 2015年07月17日 17:44
  • 267

POJ 1459 Power Network (多源点/汇点最大流问题)

题目链接:http://poj.org/problem?id=1459 题目给你一大段解释,其实就是废话。还给了一张解释图,其实就是误导。 题目大意:对于一个电力网来说,既有发电站,也有用电方,还...
  • u012943138
  • u012943138
  • 2014年08月26日 17:03
  • 4831

poj Power Network 1459 (多汇点多源点问题)

Power Network Time Limit: 2000MS   Memory Limit: 32768K Total Submissions: 25547   Accepted: 1...
  • yanghui07216
  • yanghui07216
  • 2015年11月04日 22:30
  • 213

POJ 1459 Power Network(网络流模板题)

这道题是一道网络流的模板题,难度在于,读懂题目。 题目大意:你有发电站,中转站,用电用户。发电站可以发电,中转站不消耗电,用户要消耗一定的电量,问最终用户能使用的最大电量是多少。 由于发电站发电有...
  • llzhh
  • llzhh
  • 2017年05月02日 10:46
  • 169

POJ 1459 Power Network(Dinic邻接表+当前弧优化)

题目链接:http://poj.org/problem?id=1459 题意:一个电网包含一些结点(电站、消费者、调度站),这些结点通过电线连接。每个结点u 可能被供给s(u)的电能,s(u)≥0;...
  • u011523762
  • u011523762
  • 2016年07月18日 15:06
  • 220

poj 1459 Power Network 【图论-网络流-最大流-EK】

Power Network Time Limit: 2000MS Memory Limit: 32768K Description A power netw...
  • xingdragon
  • xingdragon
  • 2017年04月20日 21:04
  • 146

poj 1459 Power Network : 最大网络流 dinic算法实现

点击打开链接 Power Network Time Limit: 2000MS   Memory Limit: 32768K Total Submissions: 20903   Ac...
  • a27985649
  • a27985649
  • 2013年08月26日 15:14
  • 824
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:poj 1459 Power Network SAP
举报原因:
原因补充:

(最多只允许输入30个字)