此題很經典
知識點:dfs染色,點-雙連通
題意:亞瑟王要在圓桌上召開騎士會議,為了不引發騎士之間的衝突,並且能夠讓會議的議題有令人滿意的結果,每次開會前都必須對出席會議的騎士有如下要求:
1、 相互憎恨的兩個騎士不能坐在直接相鄰的2個位置;
2、 出席會議的騎士數必須是奇數,這是為了讓投票表決議題時都能有結果。
如果出現有某些騎士無法出席所有會議(例如這個騎士憎恨所有的其他騎士),則亞瑟王為了世界和平會強制把他剔除出騎士團。
現在給定準備去開會的騎士數n,再給出m對憎恨對(表示某2個騎士之間使互相憎恨的),問亞瑟王至少要剔除多少個騎士才能順利召開會議?
能夠坐在一起的人,連一條邊,題目就是求所有的點中,有多少個點不在任何乙個奇圈裡。
這個無向圖,求出每個點雙連通分量,但是不是每個點雙連通分量都是奇圈,如果它是偶圈,那麼就可以用 dfs 染色,這樣我們把每個點連通分量染色,要是染色失敗,那麼這些點都可以構成奇圈,也就是說這些點都ok。最後查一遍這些點。
有了之前的 無向圖的割頂,橋,點-雙連通分量,dfs染色,就好寫好多了!!!
#include #includeview code#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;
}
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...