日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國內(nèi)最全I(xiàn)T社區(qū)平臺 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當(dāng)前位置:首頁 > 互聯(lián)網(wǎng) > UVALive3523-Knights of the Round Table(BCC+二分圖判定)

UVALive3523-Knights of the Round Table(BCC+二分圖判定)

來源:程序員人生   發(fā)布時間:2014-10-04 08:00:00 閱讀次數(shù):3531次

題目鏈接


題意:有n個騎士經(jīng)常舉行圓桌會議,每次至少3人參加,且相互厭惡的其實不能坐在圓桌相鄰的位置。如果發(fā)生意見分歧,則要舉手表決,因此參加的騎士數(shù)目一定要為奇數(shù)。統(tǒng)計有多少人不能參加任何一個會議。

思路:這是大白上面的一道例題。我們可以先根據(jù)騎士之間的關(guān)系建立無向圖G,則題目就轉(zhuǎn)化為求不再任何一個簡單奇圈上的結(jié)點個數(shù)。如果圖G不連通,就分別對G的連通分量求解。簡單圈上的所有結(jié)點必然屬于同一個雙連通分量,因此我們只要求出所有的雙連通分量。但是二分圖是不存在奇圈的,所以我們只需要關(guān)注那些不是二分圖的雙連通分量。當(dāng)結(jié)點v所屬的某一個雙連通分量B不是二分圖,v一定屬于一個奇圈。所以我們只要判斷雙連通分量是不是二分圖就可以了。

代碼:

#include <iostream> #include <cstdio> #include <cstring> #include <vector> #include <stack> #include <algorithm> using namespace std; const int MAXN = 1050; struct edge{ edge() {} edge(int uu, int vv) { u = uu; v = vv; } int u, v; }; vector<int> g[MAXN], bcc[MAXN]; stack<edge> S; int pre[MAXN], bccno[MAXN], iscut[MAXN], odd[MAXN], color[MAXN], map[MAXN][MAXN]; int n, m, dfs_clock, bcc_cnt; int dfs(int u, int fa) { int lowu = pre[u] = ++dfs_clock; int child = 0; for (int i = 0; i < g[u].size(); i++) { int v = g[u][i]; edge e(u, v); if (!pre[v]) { S.push(e); child++; int lowv = dfs(v, u); lowu = min(lowu, lowv); if (lowv >= pre[u]) { iscut[u] = 1; bcc_cnt++; bcc[bcc_cnt].clear(); for (;;) { edge x = S.top(); S.pop(); if (bccno[x.u] != bcc_cnt) { bcc[bcc_cnt].push_back(x.u); bccno[x.u] = bcc_cnt; } if (bccno[x.v] != bcc_cnt) { bcc[bcc_cnt].push_back(x.v); bccno[x.v] = bcc_cnt; } if (x.u == u && x.v == v) break; } } } else if (pre[v] < pre[u] && v != fa) { S.push(e); lowu = min(lowu, pre[v]); } } if (fa < 0 && child == 1) iscut[u] = 0; return lowu; } void find_bcc() { memset(pre, 0, sizeof(pre)); memset(bccno, 0, sizeof(bccno)); memset(iscut, 0, sizeof(iscut)); dfs_clock = bcc_cnt = 0; for (int i = 0; i < n; i++) if (!pre[i]) dfs(i, -1); } int bipartite(int u, int cur_bccno) { for (int i = 0; i < g[u].size(); i++) { int v = g[u][i]; if (bccno[v] != cur_bccno) continue; if (color[v] == color[u]) return 0; if (!color[v]) { color[v] = 3 - color[u]; if (!bipartite(v, cur_bccno)) return 0; } } return 1; } int main() { while (scanf("%d%d", &n, &m) && (n + m)) { for (int i = 0; i < n; i++) g[i].clear(); memset(map, 0, sizeof(map)); for (int i = 0; i < m; i++) { int u, v; scanf("%d%d", &u, &v); u--; v--; map[u][v] = map[v][u] = 1; } for (int i = 0; i < n; i++) g[i].clear(); for (int i = 0; i < n; i++) for (int j = i + 1; j < n; j++) if (!map[i][j]) { g[i].push_back(j); g[j].push_back(i); } find_bcc(); memset(odd, 0, sizeof(odd)); for (int i = 1; i <= bcc_cnt; i++) { memset(color, 0, sizeof(color)); for (int j = 0; j < bcc[i].size(); j++) bccno[bcc[i][j]] = i; int u = bcc[i][0]; color[u] = 1; if (!bipartite(u, i)) for (int j = 0; j < bcc[i].size(); j++) odd[bcc[i][j]] = 1; } int ans = n; for (int i = 0; i < n; i++) if (odd[i]) ans--; printf("%d ", ans); } return 0; }


生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: 久久久国产一区二区三区 | 欧美三级在线视频 | 99久热在线精品视频观看 | 日韩国产a | 国产精品麻豆一区二区 | 国产成人毛片 | 成人在线播放 | 日韩美女在线 | 欧美手机在线观看 | 精品日韩一区 | 中文 日韩 欧美 | 在线免费视频日韩 | 日韩精彩视频 | 日韩视频在线一区二区 | 色久天 | 久久久久国产精品一区 | 99久久久国产精品免费调教网站 | 久久成人久久爱 | 国产一区二区三区在线看 | 日韩一级片 | 麻豆传媒视频 | 免费网站观看www在线观 | 欧美日韩中文在线 | 亚洲波多野| 超碰网址 | 成年人免费在线观看 | 日本欧美国产 | 国产精品一区二区三区四区视频 | 青青草青青操 | 91麻豆产精品久久久久久 | 国产成人精品久久 | 国产精品欧美一区二区 | 亚洲精品日韩精品 | 亚洲第一av在线 | 国产日韩欧美精品 | 曰韩黄色一级片 | 日韩欧美在线免费观看视频 | 国产一区二区三区精品在线观看 | 91精品久久久久久久99蜜桃 | 日韩国产在线播放 | 国产福利91精品一区二区三区 |