个人模板:无向图最小割
xnozero吧
全部回复
仅看楼主
level 12
XNoZero 楼主
1 n 为顶点数 下标从0 开始
2 O(V3)
3 DFS判连通
4 边权为1时 即是求边连通度
#include <cstdio>
#include <algorithm>
using namespace std;
const int N = 512;
const int INF = 1 << 29;
int n, m, g[N][N];
bool flag[N];
int cnt;
void Merge(int a, int b)
{
     for (int i = 0; i < n; ++ i)
     {
         g[i][a] += g[i][b];
         g[a][i] += g[b][i];
     }
     for (int i = 0; i < n; ++ i)
     {
         g[i][b] = g[i][n-1];
         g[b][i] = g[n-1][i];
     }
     g[a][a] = 0;
     -- n;
}
int MinCut()
{
     int cut = INF, d[N], w[N];
     bool seta[N];
     while ( n != 1 )
     {
         memset(seta, false, sizeof(seta));
         memset(w, 0, sizeof(w));
         for (int i = 0; i < n; i++)
         {
             int mw = -INF, mi;
             for (int j = 0; j < n; j++)
                 if (!seta[j] && mw < w[j])
                     mw = w[j], mi = j;
             d[i] = mi;
             seta[mi] = true;
             for (int j = 0; j < n; j++)
                 if (!seta[j]) w[j] += g[mi][j];
         }
         cut <?= w[d[n-1]];
         Merge(d[n-2], d[n-1]);
     }
     return cut;
}
void DFS(int u)
{
     flag[u] = true;
     ++ cnt;
     for (int i = 0; i < n; ++ i)
         if (g[u][i] && !flag[i]) DFS(i);
}
int main()
{
     int i, j, k;
     while ( scanf("%d %d", &n, &m) == 2 )
     {
         memset(g, 0, sizeof(g));
         while ( m -- )
         {
             scanf("%d %d %d", &i, &j, &k);
             g[i][j] += k;
             g[j][i] = g[i][j];
         }
         memset(flag, false, sizeof(flag));
         cnt = 0;
         DFS(0);
         if (cnt < n)
         {
             printf("0\n");
             continue;
         }
         printf("%d\n", MinCut());
     }
     return 0;
}
2010年11月23日 12点11分 1
level 1
……
2010年11月23日 13点11分 2
level 1
...
2010年11月23日 13点11分 3
level 5
......
2010年11月23日 13点11分 4
1