HDU 3002 King of Destruction(全局(无向图)最小割(SW))
来源:互联网 发布:接触网中级工软件 编辑:程序博客网 时间:2024/05/29 09:15
题目地址
题意:给你一个无向图,求出全局最小割。
思路:对于无向图,割的定义与网络流差不多,只不过没有了源点与汇点的说法而已。一个无向连通图。如果去掉一个边集可以使得该连通图变的不再连通那么这个边集就是一个割,当这些边的集合的边权最小的时候这个边集就叫做最小割。也就是说将一个连通图分成两个集合,当一个边的两个顶点分别属于这两个集合。那么这条边就属于这个割集。无向连通图的解决一般使用Stoer_Wagner算法。下图是SW的过程。
寻找 s, t 两点,然后合并于 s 点。
以上图像来自论文。
推荐一篇博客讲解SW算法。
#include <iostream>#include <cstring>#include <string>#include <queue>#include <vector>#include <map>#include <set>#include <stack>#include <cmath>#include <cstdio>#include <algorithm>#include <iomanip>#define N 110#define M 300010 #define LL __int64#define inf 0x3f3f3f3f#define lson l,mid,ans<<1#define rson mid+1,r,ans<<1|1#define getMid (l+r)>>1#define movel ans<<1#define mover ans<<1|1using namespace std;const LL mod = 1000000007;int n, m;int mapp[N][N];bool vis[N];//是否已并入集合bool in[N];//该点是否已经合并到其它点 int len[N];//记录每个点的连通度 struct Stoer_wagner { int s, t;// void init() { memset(mapp, 0, sizeof(mapp)); } int solve(){//找最大生成树 memset(vis, false, sizeof(vis)); memset(len, 0, sizeof(len)); int minlen;//找到的s-t割 int to; for (int i = 1; i <= n; i++) { int mmax = -inf; for (int j = 1; j <= n; j++) { if (!in[j] && !vis[j] && mmax < len[j]) {//找最大的len值 to = j; mmax = len[j]; } } if (to == t) {//找不到点 图本身不连通 break; } vis[to] = true;//标记 已经并入集合 minlen = mmax; s = t; t = to;// 记录前、后点 for (int j = 1; j <= n; j++) {//继续找不在集合 且 没有被合并过的点 if (in[j] || vis[j]) { continue; } len[j] += mapp[to][j];//累加 连通度 } } return minlen; } int stoer_wagner() { memset(in, false, sizeof(in)); int ans = inf; for (int i = 1; i < n; i++) { ans = min(ans, solve()); if (ans == 0) return 0;//本身不连通 in[t] = true; for (int j = 1; j <= n; j++) {//把t点合并到s点 if (in[j]) continue;//已经合并 mapp[s][j] += mapp[t][j]; mapp[j][s] += mapp[j][t]; } } return ans; }}sw;int main() { cin.sync_with_stdio(false); int a, b, c; while (cin >> n >> m) { sw.init(); for (int i = 0; i < m; i++) { cin >> a >> b >> c; a++; b++; mapp[a][b] += c; mapp[b][a] += c; } cout << sw.stoer_wagner() << endl; } return 0;}
阅读全文
0 0
- HDU 3002 King of Destruction(全局(无向图)最小割(SW))
- HDU 3002 King of Destruction(SW求最小割的值)
- hdu 3002 King of Destruction(全局最小割,StoerWagner算法)
- 求全局最小割(SW算法)
- Hdu 3691 Nubulsa Expo(无向图最小割)
- King of Destruction HDU
- hdu6081 度度熊的王国战略(无向图全局最小割 stoer-wagner)
- Stoer-Wagner无向图全局最小割(hduoj 3691 Nubulsa Expo)
- HDU 3691 Nubulsa Expo(SW算法求最小割)
- sw算法求最小割学习(*)
- poj 2914 Minimum Cut(无向图最小割)
- Hdu 6081 度度熊的王国战略 无向图全局最小割
- hdoj 3002 King of Destruction (最小割边集+Stoer-Wagner算法)
- Poj 2914 无向图的全局最小割
- Stoer-Wagner求无向图全局最小割
- 【POJ2914】Minimum Cut-无向图的全局最小割
- POJ 2914 Minimum Cut 无向图最小割SW算法
- 无向图 最小割
- 线性表-2
- Radan 自动排序文本的设置
- ajax返回json类型日期格式化
- java基础学习总结——接口
- OAuth是一个关于授权(authorization)的开放网络标准,在全世界得到广泛应用,目前的版本是2.0版。 本文对OAuth 2.0的设计思路和运行流程,做一个简明通俗的解释,主要参考材料为R
- HDU 3002 King of Destruction(全局(无向图)最小割(SW))
- Java基础学习总结——Java对象的序列化和反序列化
- Java-抽象方法和抽象类
- java基础学习总结——Java制作证书的工具keytool用法总结
- 生命周期
- http权威指南知识要点(一) 概要部分
- Win10 OneDrive总是自动开启该如何关闭
- No cached version of com.neenbedankt.gradle.plugins:android-apt:1.8 available for offline mode.
- python中Groupby使用(四)-通过函数进行分组