HDU 3002 King of Destruction(SW求最小割的值)
2013-04-29 12:11
465 查看
还是一道很典型的求最小割的值,算法依旧。
这次做这道题,我模拟了一下算法实行,发现这个模板在对点删除的处理上很巧妙。通过这次研究,算法大致的步骤和实现方法,我已经知道是怎么样的流程,但是具体的证明之类的还是很迷糊。
代码如下:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 110;
const int INF = 0x3fffffff;
int n, m;
int g
, v
, d
;
int Stoer_wagner()
{
bool vis
;
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 main()
{
while ( scanf("%d%d", &n, &m ) == 2 ) {
memset( g, 0, sizeof(g) );
int x, y, z;
while ( m-- ) {
scanf("%d%d%d", &x, &y, &z);
g[x][y] += z;
g[y][x] += z;
}
printf("%d\n", Stoer_wagner());
}
}
这次做这道题,我模拟了一下算法实行,发现这个模板在对点删除的处理上很巧妙。通过这次研究,算法大致的步骤和实现方法,我已经知道是怎么样的流程,但是具体的证明之类的还是很迷糊。
代码如下:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 110;
const int INF = 0x3fffffff;
int n, m;
int g
, v
, d
;
int Stoer_wagner()
{
bool vis
;
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 main()
{
while ( scanf("%d%d", &n, &m ) == 2 ) {
memset( g, 0, sizeof(g) );
int x, y, z;
while ( m-- ) {
scanf("%d%d%d", &x, &y, &z);
g[x][y] += z;
g[y][x] += z;
}
printf("%d\n", Stoer_wagner());
}
}
相关文章推荐
- HDU 3002 King of Destruction(全局(无向图)最小割(SW))
- hdu 3002 King of Destruction(全局最小割,StoerWagner算法)
- hdoj 3002 King of Destruction (最小割边集+Stoer-Wagner算法)
- 无向图的最小割 hdu 3002 Stoer-wagner算法
- HDU 3861--The King’s Problem【scc缩点构图 && 二分匹配求最小路径覆盖】
- hdu 3861 The King’s Problem (强连通+最小路径覆盖)
- HDU - 3861 The King’s Problem(强联通分量+最小路径覆盖)
- HDU 3861 The King’s Problem 强连通分量分解 + 二分图最小路径覆盖
- HDU 3080 The plan of city rebuild(除点最小生成树)
- HDU 3861 The King’s Problem (强连通分量缩点+二分图匹配最小路径覆盖)
- HDU 3861--The King’s Problem【scc缩点构图 && 二分匹配求最小路径覆盖】
- HDU - 3861 The King’s Problem(强连通分量+最小路径覆盖)
- HDU 3691 Nubulsa Expo(SW算法求最小割)
- HDU 3080 The plan of city rebuild(除点最小生成树)
- HDU 3861 The King’s Problem 强连通缩点+最小路径覆盖
- HDU 3861 The King’s Problem 强连通分量 最小路径覆盖
- hdu 3002 全局最小割模板题
- [HDU 3861] The King's Problem (最小路径覆盖)
- HDU 3861 The King’s Problem(强连通缩点 + 最小路径覆盖)
- hdu 3861 The King’s Problem(缩点+最小路径覆盖)