POJ 2942 點雙連通

2021-07-02 13:54:22 字數 1570 閱讀 8876

///自己試著敲試試

//莫名奇妙的過了,我還是要好好研究原理。

//點雙聯通

//每個點與其他點都至少有兩條路徑。

#include#include#include#include#include#include#include#define maxn 1020

#define maxm 1000010

using namespace std;

bool is_in[maxn];

int dfn[maxn];

int low[maxn];

int g[maxn][maxn];

int cnt,top;

int n,m,ans;

int head[maxn];

int color[maxn];

bool counted[maxn],vis[maxn];

bool is_cut_vertex[maxn];

struct edge

edge[2*maxm];

struct elem

elem(int uu,int vv):u(uu),v(vv){}

}stk[maxm*2];

void add(elem &temp)

void init()

void addedge(int a,int b)

int counter()

return ans;

}對於點雙連通分支,實際上在求割點的過程中就能順便把每個點雙連通分支求出。建立乙個棧,儲存當前雙連通分支,在搜尋圖時

每找到一條樹枝邊或後向邊(非橫叉邊),就把這條邊加入棧中。如果遇到某時滿足dfs(u)<=low(v),說明u是乙個割點,同時把邊從

棧頂乙個個取出,直到遇到了邊(u,v),取出的這些邊與其關聯的點,

組成乙個點雙連通分支。割點可以屬於多個點雙連通分支,其餘點和每條邊只屬於且屬於乙個點雙連通分支。

int judgeodd(int temp)///我覺得這裡判斷奇環的方式還是不大好理解

///這裡is_in為真的點就是當前在點雙聯通分支裡的點。。。還真是點雙聯通分支的點}}

return 0;

}void tarjan(int dep, int parent, int u)///初始dfs樹深度為0,父為-1,該節點為i

}if (low[u] == dep)

top--;

if (parent == -1)

descendant--;

if (descendant > 0)

is_cut_vertex[u] = true;///居然是用來判斷割點的,好像和本題無關。。

}int main()

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

for(int j=1;j<=n;j++)

if(!g[i][j] && i!=j)

addedge(i,j);

ans=0;

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

if(!vis[i])

ans=n-ans;

cout<}

}

poj 2942 點雙聯通

題意 亞瑟王要在圓桌上召開騎士會議,為了不引發騎士之間的衝突,並且能夠讓會議的議題有令人滿意的結果,每次開會前都必須對出席會議的騎士有如下要求 1 相互憎恨的兩個騎士不能坐在直接相鄰的2個位置 2 出席會議的騎士數必須是奇數,這是為了讓投票表決議題時都能有結果。如果出現有某些騎士無法出席所有會議 例...

poj2942解題報告

這道題其實就是求割點數量 用點雙聯通 include include include include using namespace std const int maxn 1001 const int maxm 2 maxn maxn const int inf 99999999 struct ty...

poj2942 解題報告

本來想下午做完了週末好好玩,結果尼瑪做了一晚上.題意 亞瑟王要在圓桌上召開騎士會議,為了不引發騎士之間的衝突,並且能夠讓會議的議題有令人滿意的結果,每次開會前都必須對出席會議的騎士有如下要求 1 相互憎恨的兩個騎士不能坐在直接相鄰的2個位置 2 出席會議的騎士數必須是奇數,這是為了讓投票表決議題時都...