UVA818解题报告
生活随笔
收集整理的這篇文章主要介紹了
UVA818解题报告
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
/*
* UVA 818
*理解了題意和水題差不多
*
*條件:一些可能相同的無向邊
*
*要求:
* 構建一個滿足如下三個要求的圖
* 一、不能有環
* 二、連成一條直線
* 三、所有節點要連在一起
*
*操作:我們僅可以選中一個節點來連接不同的線段
* 每當我們選中一個節點時,該節點與其他節點的連接斷開
* 此時,節點可用于連接線段
*
*解法:位運算暴力枚舉節點狀態(選中或未選中)
*
*注意:測試數據極強,注意處理相同邊
*
*PS:因為博主最開始沒有注意到相同邊的情況,所以
* 博主這里其實采用了一種比較費勁的解法
*
*測試數據:Sample Input
2 1 2 1 2 -1 -1
2 1 2 2 1 1 2 2 1 -1 -1
3 1 2 -1 -1
0Sample output
Set 1: Minimum links to open is 0
Set 2: Minimum links to open is 0
Set 3: Minimum links to open is 1
*/#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <vector>using namespace std;#define N 30
#define INF 0x3f3f3f3f
#define _for(i,a,b) for (int i = (a); i < (b); ++i)int n, cnt;
int vis[N], ma[N][N];
vector<int> G[N];void init() {int u, v;memset(ma, 0, sizeof(ma));_for (i, 0, N) G[i].clear();while (scanf("%d%d", &u, &v) != EOF && u != -1) {if (!ma[u][v]) {G[u].push_back(v); G[v].push_back(u);ma[u][v] = 1; ma[v][u] = 1;}}
}int num(int x) {return x == 0 ? 0 : num(x / 2) + (x & 1);
}//檢查是否有環
bool dfs(int i, int s, int f) {if (vis[i]) return true;vis[i] = 1;_for (j, 0, G[i].size()) {int v = G[i][j];if (v == f) continue;if ((1 << (v - 1) & s)) continue;if (dfs(v, s, i)) return true;}return false;
}bool check(int s) {//檢查是否存在是否有兩個或多個分支for (int i = 1; i <= n; ++i) {int res = 0;if ((1 << (i - 1)) & s) continue;_for (j, 0, G[i].size()) {int v = G[i][j];if ((1 << (v - 1)) & s) continue;++res;}if (res > 2) return true;}//檢查是否構成環cnt = 0;memset(vis, 0, sizeof(vis));for (int i = 1; i <= n; ++i) {if ((1 << (i - 1)) & s) continue;if (vis[i]) continue;++cnt;if (dfs(i, s, -1)) {return true;}}return false;
}int slove() {int ans = INF;_for (i, 0, (1 << n)) {if (!check(i)) {if (num(i) >= cnt - 1) {ans = min(ans, num(i));}}}return ans;
}int main() {#ifndef ONLINE_JUDGEfreopen("in.txt", "r", stdin);freopen("out.txt", "w", stdout);#endif // ONLINE_JUDGEint kase = 0;while (scanf("%d", &n) == 1 && n) {init();printf("Set %d: Minimum links to open is %d\n", ++kase, slove());}return 0;
}
總結
以上是生活随笔為你收集整理的UVA818解题报告的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux/Unix开发之make和ma
- 下一篇: 绝对深入单例模式