poj 2942 點雙聯通

2021-06-17 19:17:40 字數 1080 閱讀 7773

題意:

亞瑟王要在圓桌上召開騎士會議,為了不引發騎士之間的衝突,並且能夠讓會議的議題有令人滿意的結果,每次開會前都必須對出席會議的騎士有如下要求:

1、  相互憎恨的兩個騎士不能坐在直接相鄰的2個位置;

2、  出席會議的騎士數必須是奇數,這是為了讓投票表決議題時都能有結果。

如果出現有某些騎士無法出席所有會議(例如這個騎士憎恨所有的其他騎士),則亞瑟王為了世界和平會強制把他剔除出騎士團。

現在給定準備去開會的騎士數n,再給出m對憎恨對(表示某2個騎士之間使互相憎恨的),問亞瑟王至少要剔除多少個騎士才能順利召開會議?

注意:1、所給出的憎恨關係一定是雙向的,不存在單向憎恨關係。

2、由於是圓桌會議,則每個出席的騎士身邊必定剛好有2個騎士。即每個騎士的座位兩邊都必定各有乙個騎士。

3、乙個騎士無法開會,就是說至少有3個騎士才可能開會。

做法:1,先對憎惡關係建圖

2,建立上圖的反圖,這時候,圖表明的關係是可以坐在一起。

3,求圖中所有點大於等於3的圈。(tarjan求點雙連通)

4,求3的求出的圈是不是奇圈。(交叉染色法)

#include#include#include#include#include#include#includeusing namespace std;

#define maxn 1001

#define maxm 1000005

vectorvc[maxn];

stackst;

vectorvec;

int maps[maxn][maxn];

int n,m;

struct list

edge[maxm*2];

int tops,head[maxm*2],vis[maxm*2];

int nums,dnf[maxn],low[maxn],instack[maxn],times;

int mark[maxn],odd[maxn],visit[maxn];;

void add(int x,int y)

void init()

// cout<=3)dos(x);}}

else if(dnf[y]

POJ 2942 點雙連通

自己試著敲試試 莫名奇妙的過了,我還是要好好研究原理。點雙聯通 每個點與其他點都至少有兩條路徑。include include include include include include include define maxn 1020 define maxm 1000010 using nam...

poj 2942 奇圈 點雙聯通分量

昨天開了一段時間然後不會。今天又看了一上午,雖然不是很徹底,但是最終好事搞定了 真是感覺到心力憔悴。奇圈 邊數為奇數的圈 定理 二分圖中不存在奇圈 include include includeusing namespace std const int m 1008 int low m t,dfs ...

poj2942解題報告

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