csu 1356 Catch
題意:給定n個點,m條邊的無向圖(沒有重邊和子環)。從給定點出發,每個時間走到相鄰的點,可以走重復的邊,相鄰時間不能停留在同一點,判斷是否存在某個時間停留在任意的n個點。
分析:
(1)首先,和出發點的位置沒有關系。因為可以走重復的邊,且時間沒有限制大小。
(2)圖必須是聯通的
(3)
1)圖為2-0-1-3
從0點出發(時間為0),一個時間後到達1或2(時間為1),再一個時間後到達0或3(時間為2)。。。
可以發現,點分為兩類,奇數時間到達和偶數時間到達,答案為NO
2)圖為:2-0-1-2(奇環)
· 此圖中的點,即可以在奇數時間到達,又可以在偶數時間到達。則答案為YES。比如都有個偶數的到達時間,在小時間在往返的走重復邊後,(不改變奇偶,只改變大小,+2)
3)圖為:2-0-1-3-2(偶環)
此圖中的點和1)類似,同樣分為兩類。答案為NO
綜上:所有點必須都能在奇數時間和偶數時間到達,則需要圖能夠改變到達點時間奇偶的結構。
由上可知,圖中必須存在奇環。問題變成了,判斷圖是否存在奇環和是否連通
判斷存在奇環的方法:
(1)二分圖染色 dfs染色
//#pragma warning (disable: 4786)
//#pragma comment (linker, "/STACK:16777216")
//HEAD
#include
#include
#include
#include
#include
#include
#include
#include
#include
(2)二分圖染色 bfs染色
(3)並查集
加權並查集的特例種類並查集。既可以判斷連通性,也可以判斷種類。
加權並查集,需要取模是,注意正確性,尤其是當有減法和除法。
//#pragma warning (disable: 4786)
//#pragma comment (linker, "/STACK:16777216")
//HEAD
#include
#include
#include
#include
#include
#include
#include
#include
#include