///自己試著敲試試
//莫名奇妙的過了,我還是要好好研究原理。
//點雙聯通
//每個點與其他點都至少有兩條路徑。
#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 出席會議的騎士數必須是奇數,這是為了讓投票表決議題時都...