SGU 212. Data Transmission

Brief description :

给定一张分层图,求一次阻塞流…

Analyse :

… 我还有东西需要确认。

/*
    Author: xiaodao
    Prog: ZOJ 2364 / SGU 212. Data Transmission
    Status: Labeled
    Last modify: GMT +8 Aug 22th 01:52
    Tags: Network_flow
*/


#include 
#include 
#include 
#include 

using namespace std;
const int INF = 0x7fffffff;
const int N = 1500, M = 300000 * 2;
struct edge{
    int v, c;
    void insert(int, int);
} E[M+1]; int edge_count;
vector adj[N+1], reverse_adj[N+1]; int D[N+1];
int n, m, l, s, t;


int _r(int x){
    return x ^ 1;
}

void edge::insert(int a, int b){
    v = a; c = b;
}

void add_edge(int x, int y, int c){
    adj[x].push_back(edge_count); E[edge_count++].insert(y, c);
}

void add_reverse_edge(int x, int y, int c){
    reverse_adj[x].push_back(edge_count); E[edge_count++].insert(y, c);
}





void Dinitz(){
    //bfs();
    //while (D[t]!=-1){
        int stack[N+1], cur[N+1], top = 0;
        memset(cur, 0, sizeof(cur));
        stack[0] = M;

        int u; size_t i;
        while (top!=-1){
            u = E[stack[top]].v;

            //cout << u << endl;

            if (u == t){
                int handle = 1;
                for (int i=2;i<=top;i++)
                    if (E[stack[i]].c < E[stack[handle]].c)
                        handle = i;


                int delta = E[stack[handle]].c;

                for (int i=1;i<=top;i++){
                    E[stack[i]].c -= delta;
                    E[_r(stack[i])].c += delta;
                }

                for (int i=handle;i<=top;i++) //###
                    cur[E[stack[i]].v] = 0; // ###
                top = handle - 1;
                continue;
            }

            for (i=cur[u];i layer[N+1];
    long long excess[N+1];
    cin >> n >> m >> l;

    edge_count = 0;
    for (int i=1;i<=n;i++)
        adj[i].clear(), reverse_adj[i].clear();
    for (int i=1;i<=l;i++)
        layer[i].clear();


    for (int i=1;i<=n;i++){
        scanf("%d", &D[i]); layer[D[i]].push_back(i);
        if (D[i] == 1) s = i;
        else if (D[i] == l) t = i;
    }

    int x, y, c;
    for (int i=1;i<=m;i++){
        scanf("%d%d%d", &x, &y, &c);
        add_edge(x, y, c);
        add_reverse_edge(y, x, 0);
    }

    E[M].v = s; // ~







/* 我是贪心初始流。。。 */

/* 步骤一:灌水 */

    memset(excess, 0, sizeof(excess));
    //excess[s] = INF;
    excess[s] = ((long long)1 << 63 ) - 1;
    for (int i=1;i=2;i--){
        for (size_t j=0;j 0){
                for (size_t k=0;k= 0){
                            rev.c += excess[u]; arc.c -= excess[u];
                            excess[arc.v] += excess[u]; excess[u] = 0;
                            break;
                        }
                        else {
                            excess[u] -= arc.c; excess[arc.v] += arc.c;
                            rev.c += arc.c; arc.c = 0;
                        }
                    }
                }
            }
        }
    }
}

int main(){
    //int T; cin >> T;
    //for (int i=0;i

External link :

[ZJU][2364][Data Transmission] Helanic Abyss
Andrew Stankevich’s Contest #3解题报告 by watashi