ZOJ 2753 Min Cut ( SW )

来源:互联网 发布:黄金现货软件 编辑:程序博客网 时间:2024/04/27 22:00

和之前做过的一道是一样的,不同的是这道题要判断是否连通

代码:(写代码一定要认真,一定一定)

#include <cstdio>#include <cstring>#include <iostream>using namespace std;const int N = 550;const int INF = 0x3fffffff;int n, m;int v[N], g[N][N], d[N], father[N];int Stoer_wagner() {    bool vis[N];    int i, j, res = INF;    for ( i = 0; i < n; ++i ) v[i] = i;    while ( n > 1 ) {        int maxp = 1, prev = 0;        for ( i = 1; i < n; ++i ) {            d[v[i]] = g[v[0]][v[i]];            if ( d[v[i]] > d[v[maxp]] ) maxp = i;        }        memset( vis, 0, sizeof(vis) );        vis[v[0]] = true;        for ( i = 1; i < n; i++ ) {            if ( i == n-1 ) {                res = min( res, d[v[maxp]] );                for ( j = 0; j < n; ++j ) {                    g[v[prev]][v[j]] += g[v[j]][v[maxp]];                    g[v[j]][v[prev]] = g[v[prev]][v[j]];                }                v[maxp] = v[--n];            }            vis[v[maxp]] = true;            prev = maxp;            maxp = -1;            for ( j = 1; j < n; ++j )                 if ( !vis[v[j]] ) {                    d[v[j]] += g[v[prev]][v[j]];                    if ( maxp == -1 || d[v[maxp]] < d[v[j]] ) maxp = j;                }        }    }    return res;}int find( int x ) {    return father[x] == x ? x : father[x] = find( father[x] );}int main(){    while ( scanf("%d%d", &n, &m) == 2 ) {        memset(g, 0, sizeof(g));        for ( int i = 0; i <= n; ++i ) father[i] = i;        int x, y, z;        while ( m-- ) {            scanf("%d%d%d", &x, &y, &z);            g[x][y] += z;            g[y][x] += z;            int a = find( x );            int b = find( y );            if ( a != b ) father[a] = b;        }        int fn = 0;        for ( int i = 0; i < n; ++i ) if ( find(i) == i ) {            fn++;            if ( fn > 1 ) break;        }        if ( fn > 1 ) {            printf("0\n");            continue;        }        printf("%d\n", Stoer_wagner());    }}