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...