雙聯通分量 HDOJ 5215 Cycle

2021-07-02 05:01:17 字數 2170 閱讀 9654

bc的官方題解已經講的不能再清楚了。。。

對於問題1,我們只需要進行二分圖染色判定這個圖是否是二分圖即可

二分圖中必定不存在奇環,而非二分圖中必定存在奇環

對於問題2,首先我們注意到乙個環一定存在於雙聯通分量(既去掉任何一條邊後仍然聯通的點集)內

通過tarjan演算法,可以分離出所有的雙聯通分量,然後分別檢查其中是否存在偶環

對於乙個雙聯通分量,如果它僅僅是乙個環,那麼只需判斷它是否是偶環即可

否則其中必定存在兩個纏繞(共享至少一條邊)的環,若這兩個環的都是奇環,那麼去掉共享的邊之後可以組成乙個大偶環

因此,除非乙個雙聯通分量僅僅是乙個奇環,那麼其中必定存在偶環

而我們可以發現,若乙個非單點的雙聯通分量僅僅由乙個環構成,那麼它的點數必定等於邊數,據此判斷即可

時間複雜度o(n + m)

#include #include #include #include #include #include #include #include #include #include #include #include #include #define maxn 100005

#define maxm 600005

#define eps 1e-12

#define mod 998244353

#define inf 0x3f3f3f3f

#define pi (acos(-1.0))

#define lowbit(x) (x&(-x))

#define mp make_pair

#define ls o<<1

#define rs o<<1 | 1

#define lson o<<1, l, mid

#define rson o<<1 | 1, mid+1, r

#pragma comment(linker, "/stack:102400000,102400000")

#define pii pairtypedef long long ll;

typedef unsigned long long ull;

//typedef int ll;

using namespace std;

ll qpow(ll a, ll b)return res;}

ll powmod(ll a, ll b)return res;}

// head

struct edge

*h[maxn], e[maxm], *edges;

int dfn[maxn];

int low[maxn];

int cnt[maxn];

int vis[maxn];

int tcnt[maxn];

int belong[maxn];

stacks;

int n, m, dfs_clock, scnt, ok;

void addedges(int u, int v)

void init()

void tarjan(int u, int fa)

if(!dfn[v])

else low[u] = min(low[u], dfn[v]);

} if(low[u] == dfn[u]) while(t != u); }}

void dfs(int u, int fa)

}void work()

ok = 0;

for(int i = 1; i <= n; i++) if(vis[i] == -1) vis[i] = 0, dfs(i, 0);

if(ok) printf("yes\n");

else printf("no\n");

for(int i = 1; i <= n; i++) if(!dfn[i]) tarjan(i, 0);

for(edge *e = e; e != edges; e += 2)

if(belong[e->v] == belong[e->u]) tcnt[belong[e->u]]++;

ok = 0;

for(int i = 1; i <= scnt; i++)

if(ok) printf("yes\n");

else printf("no\n");

}int main()

return 0;

}

邊雙聯通分量

首先什麼是邊雙聯通分量?邊雙連通分量是指,在 無向圖 中刪除任意一條邊依舊聯通的聯通塊 之前講過強連通分量,這裡邊雙聯通分量的做法也需要利用tarjan演算法獲得邊雙聯通分量。對於邊雙聯通分量中還有乙個概念,就是橋。橋指的是 刪除該邊圖不再連通。對應的另乙個概念是 割點 割點的的是 如果除去此節點和...

邊雙聯通分量

noip最後一次學習 敲板子 橋 如果這條邊去掉後圖的聯通分量增加,則這條邊稱為橋。邊雙聯通分量 如果乙個對於乙個圖的某個子圖,任意兩點至少存在兩條 邊不重複 的路徑,則這個子圖是邊雙聯通分量。很顯然,任意乙個邊雙中不含有橋。除橋外每條邊都僅屬於乙個邊雙。如果把原圖中所有橋刪除,每個聯通分量都是原圖...

點 邊 雙聯通分量1 1

點 include include include include include includeusing namespace std const int maxn 1000 10 int n,m int bcc cnt int dfs clock bcc cnt計數一共有多少個點 雙連通分量 i...