某岛

… : "…アッカリ~ン . .. . " .. .
August 16, 2010

RQNOJ 306. 破坏石油运输系统问题

Brief description :

寻找哪些边的删除会影响最大流流量。

Analyse :

(我之前想的方法一直是扫描每一条边是否饱和。。不过这个想法太暴力了。。因为会存在可以从其他地方绕过这条边而产生同样效果的路径。)

。。。Dinic 完以后,用 Floyd 求残量网络的传递闭包。
注意判断边的时候要两个方向同时呀。

/*
    ID: xiaodao
    PROG: RQ 306. 破坏石油运输系统问题
    TAGS: Network-Flow
*/

#include 
#include 
#include 
using namespace std;
const int INF = 1000000;
const int N = 131, M = N*(N-1)/2;
struct edge{
    int x, y;
};
struct rec{
    int v, p, k;
}; // Stack type
int C[N][N]; // Residual graph ..
int L[N]; edge E[M]; // Leval label ... Edge content.
int n, m, s, t;





void bfs(){
    memset(L, -1, sizeof(L));

    int Q[N], head, tail;

    head = 0; tail = 1; Q[0]  = 1;
    L[1] = 0;

    int u, v;
    while (headn){
                L[u] = -1;
                top--;
            }
            else{
                cache[u] = v+1; top++;
                stack[top].v = v;
                if (C[u][v]  < stack[top-1].k){
                    stack[top].k = C[u][v];
                    stack[top].p = top-1;
                }
                else{
                    stack[top].k = stack[top-1].k;
                    stack[top].p = stack[top-1].p;
                }
            }
        }
        bfs();
    }
}

void solve(){
    bool G[n+1][n+1];

    for (int i=1;i<=n;i++)
        for (int j=1;j<=n;j++)
            G[i][j] = (C[i][j] != 0);

    for (int k=1;k<=n;k++)
        for (int i=1;i<=n;i++)
            for (int j=1;j<=n;j++)
                G[i][j] = G[i][j] || (G[i][k] && G[k][j]);

    vector list;
    for (int i=1;i<=m;i++)
        if (!G[E[i].x][E[i].y] || !G[E[i].y][E[i].x]) list.push_back(i);

    cout << list.size() << endl;
    for (int i=0;i> n >> m >> s >> t;
    for (int i=1;i<=m;i++){
        scanf("%d%d%d", &E[i].x, &E[i].y, &c);
        r(E[i].x); r(E[i].y);
        C[E[i].x][E[i].y] += c;
        C[E[i].y][E[i].x] += c;
    }
}



int main(){
    init(); dinic();
    solve();
}