日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

UVA818解题报告

發布時間:2023/12/14 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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解题报告的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。