HDU 5215 Cycle 奇圈和偶圈

2021-07-04 14:58:31 字數 1125 閱讀 8880

題目大意:給你一張有向圖,問是否存在奇圈和偶圈

解題思路:二分圖染色,如果染色成功,證明沒有奇圈

給出大神的傳送門

染色的時候,如果下乙個點已經被染了,說明已經形成了乙個圈了,那怎麼判斷是奇圈還是偶圈

首先,該點如果和下乙個點的顏色不同,那麼該圈就是偶圈了,反之,如果該點與下一點的顏色相同,該圈就是奇圈了

但是存在一種情況,兩個奇圈合成了乙個偶圈的,比如平行四邊形加上一條對角線,這張圖就是奇圈和偶圈的結合了,那麼現在的問題就是,怎麼判斷奇圈裡面有偶圈了

如果兩個奇圈存在公共點的話,那麼這兩個奇圈就可以組成乙個偶圈了

證明:如果兩個奇圈分別有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 密...