和之前做过的一道是一样的,不同的是这道题要判断是否连通
代码:(写代码一定要认真,一定一定)
#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());
}
}