題目大意:給你一張有向圖,問是否存在奇圈和偶圈
解題思路:二分圖染色,如果染色成功,證明沒有奇圈
給出大神的傳送門
染色的時候,如果下乙個點已經被染了,說明已經形成了乙個圈了,那怎麼判斷是奇圈還是偶圈
首先,該點如果和下乙個點的顏色不同,那麼該圈就是偶圈了,反之,如果該點與下一點的顏色相同,該圈就是奇圈了
但是存在一種情況,兩個奇圈合成了乙個偶圈的,比如平行四邊形加上一條對角線,這張圖就是奇圈和偶圈的結合了,那麼現在的問題就是,怎麼判斷奇圈裡面有偶圈了
如果兩個奇圈存在公共點的話,那麼這兩個奇圈就可以組成乙個偶圈了
證明:如果兩個奇圈分別有a,b條邊,兩個圈存在乙個公共點,令其有c條公共邊,那麼把他們合成乙個環,環就有a + b - 2 * c條邊了,可得,這是個偶圈(畫個圖就知道,平行四邊形加上一條對角線)
#include
#include
#pragma comment(linker, "/stack:102400000,102400000")
#define n 100010
#define m 600010
struct edgee[m];
int head[n], color[n], pre[n], belong[n];
int n, m, tot;
void addedge(int u, int v)
void init()
}bool odd, even;
int cnt;
void dfs(int u, int fa)
belong[t] = cnt;
t = pre[t];
if (t == u || t == -1)
break;}}
if (color[v] == 3 - color[u]) even = true;
if (!color[v])
}}void solve()
}printf("%s\n", odd ? "yes" : "no");
printf("%s\n", even ? "yes" : "no");
}int main()
return
0;}
HDU 5215 Cycle 奇偶環的判定
給出乙個無向圖,n 100000,m 300000,判斷圖中是否有奇圈,是否有偶圈。對於奇圈的判定,可以利用二分圖染色。若此圖是二分圖,那麼其中一定不存在奇圈,若此圖不是二分圖,那必定存在奇圈。若原圖不連通,則對每個連通分量分別做二分圖染色 對於偶圈的判定,首先考慮所有圈必然在邊雙連通分量中 題中要...
hdu2045 c語言詳解
因為格仔數為1,2,3時為特殊情況,所以從4開始考慮,分為兩種情況,第一種情況 當第n 1個格仔與第乙個格仔不同時,因為題目要求第乙個格仔和最後乙個不相同,所以此時巧好能看成總共只有n 1個格仔,然後又回到有n格仔時,第n個格仔因為不和第乙個和第n 1個格仔相同,當第n 1個格仔和第乙個格仔確定時,...
hdu2043 密碼(C語言)
problem description 網上流傳一句話 常在網上飄啊,哪能不挨刀啊 其實要想能安安心心地上網其實也不難,學點安全知識就可以。首先,我們就要設定乙個安全的密碼。那什麼樣的密碼才叫安全的呢?一般來說乙個比較安全的密碼至少應該滿足下面兩個條件 1 密碼長度大於等於8,且不要超過16。2 密...