LA 3523 圓桌騎士

2022-04-01 07:47:42 字數 1807 閱讀 2118

此題很經典

知識點:dfs染色,點-雙連通

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

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

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

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

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

能夠坐在一起的人,連一條邊,題目就是求所有的點中,有多少個點不在任何乙個奇圈裡。

這個無向圖,求出每個點雙連通分量,但是不是每個點雙連通分量都是奇圈,如果它是偶圈,那麼就可以用 dfs 染色,這樣我們把每個點連通分量染色,要是染色失敗,那麼這些點都可以構成奇圈,也就是說這些點都ok。最後查一遍這些點。

有了之前的 無向圖的割頂,橋,點-雙連通分量,dfs染色,就好寫好多了!!!

#include #include 

#include

#include

#include

#include

using

namespace

std;

const

int maxn = 1000 +10

;int

a[maxn][maxn];

int pre[maxn<<1

];bool

iscut[maxn];

intbccno[maxn];

intdfs_clock;

intbcc_cnt;

vector

g[maxn],bcc[maxn];

struct

edge

};stack

s;int dfs(int u, int

fa);

if(!pre[v])

if(bccno[x.v] !=bcc_cnt)

if(x.u == u && x.v == v) break

; }}}

else

if(pre[v] < pre[u] && v !=fa)

}if(fa < 0 && child == 1) iscut[u] = 0

;

return

lowu;

}void find_bcc(int

n)int

odd[maxn], color[maxn];

bool bipartite(int u, int

b) }

return

true;}

intmain()

for(int u = 0; u < n; u++)

for(int v = u+1; v < n; v++)

if(!a[u][v])

find_bcc(n);

memset(odd,

0, sizeof

(odd));

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

}int ans =n;

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

if(odd[i])

ans--;

printf(

"%d\n

", ans);

}return0;

}

view code

1214 圓桌會議

problem description hdu acm集訓隊的隊員在暑假集訓時經常要討論自己在做題中遇到的問題.每當面臨自己解決不了的問題時,他們就會圍坐在一張圓形的桌子旁進行交流,經過大家的討論後一般沒有解決不了的問題,這也只有hdu acm集訓隊特有的圓桌會議,有一天你也可以進來體會一下哦 在一...

1491 圓桌座位(DFS)

n 個人圍坐一圈,有 m 對朋友關係。第 i 對朋友關係是指,編號是 ai的人和編號是 bi 的人是朋友。現在要給他們安排座位,要求所有相鄰的人不能是朋友。問共有多少種方案?如果兩個方案只有旋轉角度不同,則我們將其視為一種方案。輸入格式 第一行包含兩個整數 n,m。接下來 m 行,每行包含一對 ai...

HDU 4841 圓桌問題

acm模版 這個題簡單的來就是暴力列舉約瑟夫環,當然,太暴力也不好,適當的用資料結構優化一下也是有必要的,這裡用向量維護,成功水過。include include include include include using namespace std const int maxn 4e4 const...