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,转载请注明出处。

相关文章推荐

POJ1459 Power Network (SAP+GAP优化)

题目大意:就是有发电站、用户、中转站,还有电力传输路线,每个节点有可能被传输了多少电,也可能消耗了多少电,也可能生产了多少电,也可能传输了多少电。发电站除了生产电之外都可能会。 用户除了生产电之外都...

poj 1459 Power Network sap + gap

# include # include # define M 666 using namespace std; const int inf=2100000000; int n,nb,nc,m...

POJ:1459 Power Network

Power Network Time Limit: 2000MS   Memory Limit: 32768K Total Submissions: 28331   ...
  • zjq_01
  • zjq_01
  • 2017年05月26日 15:20
  • 72

《网络流学习笔记03&&POJ1459 &&ZOJ 1734 Power Network(多源点,多汇点)》

题目链接:click here 题意:一个电力网络有n个点,有np个发电站,nc个消耗点,其余的为中转站。m条电缆,中转站既不发电也不耗电。每条电缆都有一个最大容量。 思路:设置一个超级源点和一个超...

【最大流】POJ-1459 Power Network

Power Network Time Limit: 2000MS   Memory Limit: 32768K       Description...

POJ 1459 Power Network

题目大意: 无注释代码: 注释代码: 单词解释:

poj1459(Power Network + EK)

题目链接:http://poj.org/problem?id=1459      题目大意:有一个电力网络,总共有n个站点,其中有np个发电站,和nc个耗电点。在这n个点之间有m条电线连接u、v(可...
  • kath_y
  • kath_y
  • 2012年08月02日 10:58
  • 392

[POJ 1459 Power Network] Dinic网络流

[POJ 1459 Power Network] Dinic网络流分类:Graph Max Flow1. 题目链接[POJ 1459 Power Network] 2. 题意描述一个电网包含一些结点(...

Power Network poj1459 最大流

Description有一个供电网络,一些点能提供电力,一些点要消耗电力,还有一些不耗电的输电线,求最大总耗电Solution输入格式扯淡我果然还是太弱了,英语题目都看不懂啊。把供电站和耗电站(暂且这...
  • jpwang8
  • jpwang8
  • 2017年03月17日 19:35
  • 176

POJ 1459 Power Network

这题是一个标准的最大流问题。 题目大意是:有n个点,其中nc个点是发电站,有np个点是用户,其他的是中转站,求最大流。 问题中存在着多源点和多汇点,我们可以把这些源点和汇点当作中转站,在虚拟一个超级源...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:poj 1459 Power Network SAP
举报原因:
原因补充:

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