hihocoder -1121-二分圖的判定

來源:互聯網
上載者:User

標籤:net   遍曆   ace   一個人   alt   max   應該   stat   隨機播放   

hihocoder -1121-二分圖的判定

1121 : 二分圖一?二分圖判定時間限制:10000ms單點時限:1000ms記憶體限制:256MB描述

大家好,我是小Hi和小Ho的小夥伴Nettle,從這個星期開始由我來完成我們的Weekly。

新年回家,又到了一年一度大齡剩男剩女的相親時間。Nettle去姑姑家玩的時候看到了一張姑姑寫的相親情況表,上面都是姑姑介紹相親的剩男剩女們。每行有2個名字,表示這兩個人有一場相親。由於姑姑年齡比較大了記性不是太好,加上相親的人很多,所以姑姑一時也想不起來其中有些人的性別。因此她拜託我檢查一下相親表裡面有沒有錯誤的記錄,即是否把兩個同性安排了相親。

OK,讓我們愉快的暴力搜尋吧!

才怪咧。

對於拿到的相親情況表,我們不妨將其轉化成一個圖。將每一個人作為一個點(編號1..N),若兩個人之間有一場相親,則在對應的點之間串連一條無向邊。(如)

因為相親總是在男女之間進行的,所以每一條邊的兩邊對應的人總是不同性別。假設表示男性的節點染成白色,女性的節點染色黑色。對於得到的無向圖來說,即每一條邊的兩端一定是一白一黑。如果存在一條邊兩端同為白色或者黑色,則表示這一條邊所表示的記錄有誤。

由於我們並不知道每個人的性別,我們的問題就轉化為判定是否存在一個合理的染色方案,使得我們所建立的無向圖滿足每一條邊兩端的頂點顏色都不相同。

那麼,我們不妨將所有的點初始為未染色的狀態。隨機播放一個點,將其染成白色。再以它為起點,將所有相鄰的點染成黑色。再以這些黑色的點為起點,將所有與其相鄰未染色的點染成白色。不斷重複直到整個圖都染色完成。(如)

在染色的過程中,我們應該怎樣發現錯誤的記錄呢?相信你一定發現了吧。對於一個已經染色的點,如果存在一個與它相鄰的已染色點和它的顏色相同,那麼就一定存在一條錯誤的記錄。(如的4,5節點)

到此我們就得到了整個圖的演算法:

 

  1. 選取一個未染色的點u進行染色
  2. 遍曆u的相鄰節點v:若v未染色,則染色成與u不同的顏色,並對v重複第2步;若v已經染色,如果 u和v顏色相同,判定不可行退出遍曆。
  3. 若所有節點均已染色,則判定可行。

接下來就動手寫寫吧!

輸入

第1行:1個正整數T(1≤T≤10)

接下來T組資料,每組資料按照以下格式給出:

第1行:2個正整數N,M(1≤N≤10,000,1≤M≤40,000)

第2..M+1行:每行兩個整數u,v表示u和v之間有一條邊

輸出

第1..T行:第i行表示第i組資料是否有誤。如果是正確的資料輸出”Correct”,否則輸出”Wrong”

範例輸入
25 51 21 33 45 21 55 51 21 33 45 23 5
範例輸出
WrongCorrect

 

 

 

題解:

簡單水題。(dfs就可以),好久沒有練習,腦迴路又短路了55555555555555

 

 

#include <iostream> #include <vector> using namespace std; const int maxn = 10005; vector<int> vt[maxn]; bool flag; int state[maxn]; void dfs(int pt, int s){ if(!flag){ return; }state[pt] = s; for(int i=0; i<vt[pt].size(); ++i){ if(state[vt[pt][i]] == 0){dfs(vt[pt][i], (-1*s)); }else if(state[vt[pt][i]] == state[pt]){flag = false; break; }}}void solver(int n){for(int i=1; i<=n; ++i){if(!flag){break; }if(state[i] == 0){dfs(i, 1); }}}int main(){freopen("in.txt", "r", stdin); int test_num, n, m, x, y; scanf("%d", &test_num); while(test_num--){scanf("%d %d", &n, &m); for(int i=0; i<=n; ++i){vt[i].clear(); state[i] = 0; }for(int i=0; i<m; ++i){scanf("%d %d", &x, &y); vt[x].push_back(y); vt[y].push_back(x); }flag = true; solver(n); if(flag){printf("Correct\n");}else{printf("Wrong\n");}}return 0; }

  

 

hihocoder -1121-二分圖的判定

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.