习题7-4 切断圆环链(Cutting Chains, ACM/ICPC World Finals 2000, UVa818)
2017-10-26 16:06
666 查看
思路:枚举所有的拆分方式,判断是否有某个点degree > 2 及是否有环,记录最小的cut_num。
1. 无向图的dfs判环,需要标记前驱节点。
2. 以vector存图时要注意输入重边的存在(坑啊,wa了两个点。。),小图可以用G[][]来存。
1. 无向图的dfs判环,需要标记前驱节点。
2. 以vector存图时要注意输入重边的存在(坑啊,wa了两个点。。),小图可以用G[][]来存。
#include <iostream> #include <string> #include <vector> #include <stack> #include <queue> #include <deque> #include <set> #include <map> #include <algorithm> #include <sstream> #include <utility> #include <cstring> #include <cstdio> #include <cstdlib> #include <ctime> #include <cmath> #include <cctype> #define CLEAR(a, b) memset(a, b, sizeof(a)) #define IN() freopen("in.txt", "r", stdin) #define OUT() freopen("out.txt", "w", stdout) #define LL long long #define mod 1000000007 #define INF 10000007 #define eps 1e-5 #define PI 3.1415926535898 using namespace std; //-------------------------CHC------------------------------// const int maxn = 20; int n; vector<int> G[maxn]; bool cut[maxn], vis[maxn]; int component, cut_num; void calc_cut(int subset) { CLEAR(cut, 0); cut_num = 0; for (int i = 0; i < n; ++i) { if ((1 << i) & subset) cut[n - i] = true, ++cut_num; } } bool too_much() { for (int i = 1; i <= n; ++i) { if (cut[i]) continue; int deg = 0; for (int j = 0; j < G[i].size(); ++j) if (!cut[G[i][j]]) ++deg; if (deg > 2) return true; } return false; } bool dfs(int u, int f) { vis[u] = true; for (int i = 0; i < G[u].size(); ++i) { int v = G[u][i]; if (!cut[v] && v != f) { if (vis[v]) return true; else if (dfs(v, u)) return false; } } return false; } bool have_circle() { CLEAR(vis, 0); component = 0; for (int i = 1; i <= n; ++i) if (!vis[i] && !cut[i]) { if (dfs(i, -1)) return true; component++; } return false; } int main() { int kase = 1; while (~scanf("%d", &n) && n) { for (int i = 0; i < maxn; ++i) G[i].clear(); int u, v; while (scanf("%d%d", &u, &v)) { if (u == -1 || v == -1) break; G[u].push_back(v); G[v].push_back(u); } for (int i = 1; i <= n; ++i) { sort(G[i].begin(), G[i].end()); G[i].resize(unique(G[i].begin(), G[i].end()) - G[i].begin()); } int ans = n; for (int i = 0; i < (1 << n); ++i) { calc_cut(i); if (too_much() || have_circle()) continue; if(component <= cut_num + 1) ans = min(ans, cut_num); } printf("Set %d: Minimum links to open is %d\n", kase++, ans); } return 0; }
相关文章推荐
- 习题7-1 消防车(Firetruck, ACM/ICPC World Finals 1991, UVa208)
- 习题3-6 纵横字谜的答案(Crossword Answers, ACM/ICPC World Finals 1994, UVa232)
- Abbott的复仇(Abbott's Revenge, ACM/ICPC World Finals 2000, UVa 816)<经典BFS>
- UVa806 习题6-8 空间结构(Spatial Structures,ACM/ICPC World Finals 1998)
- 习题3-8 循环小数(Repeating Decimals, ACM/ICPC World Finals 1990, UVa202)
- 习题7-3 多米诺效应(The Domino Effect, ACM/ICPC World Finals 1991, UVa211)
- 算法竞赛入门经典-习题3-6 纵横字谜的答案(Crossword Answers, ACM/ICPC World Finals 1994,UVa232)
- 例题6-14 Abbott的复仇(Abbott's Revenge, ACM/ICPC World Finals 2000, UVa 816)
- 习题7-2 黄金图形(Golygons, ACM/ICPC World Finals 1993, UVa225)
- UVa816 例题 6-14 Abbott的复仇 (Abbott's Revenge,ACM/ICPC World Finals 2000)
- 习题6-13 电子表格计算器(Spreadsheet Calculator, ACM/ICPC World Finals 1992, UVa215)
- UVa227 and acm/icpc world finals 1993 谜题
- 习题6-7 Petri网模拟(Petri Net Simulation, ACM/ICPC World Finals 1998, UVa804)
- 【最大流问题 dinic算法】Internet Bandwidth, ACM/ICPC World Finals 2000, UVa820
- 习题7-4 切断圆环链 UVa818
- Message dicoding, ACM/ICPC World Finals 1991, UVa 213
- [UVa 201]Squares 正方形,ACM/ICPC World Finals 1990
- 信息解码(Message Decoding, ACM/ICPC World Finals 1991, UVa 213)
- Puzzle,ACM/ICPC World Finals 1993,UVa227
- 循环小数(Repeating Decimals, ACM/ICPC World Finals 1990, UVa202)