曹是乙隻愛刷街的老曹,暑假期間,他每天都歡快地在陽光大學的校園裡刷街。河蟹看到歡快的曹,感到不爽。河蟹決定封鎖陽光大學,不讓曹刷街。
陽光大學的校園是一張由n個點構成的無向圖,n個點之間由m條道路連線。每只河蟹可以對乙個點進行封鎖,當某個點被封鎖後,與這個點相連的道路就被封鎖了,曹就無法在與這些道路上刷街了。非常悲劇的一點是,河蟹是一種不和諧的生物,當兩隻河蟹封鎖了相鄰的兩個點時,他們會發生衝突。
詢問:最少需要多少只河蟹,可以封鎖所有道路並且不發生衝突。
輸入格式:
第一行:兩個整數n,m
接下來m行:每行兩個整數a,b,表示點a到點b之間有道路相連。
輸出格式:
僅一行:如果河蟹無法封鎖所有道路,則輸出「impossible」,否則輸出乙個整數,表示最少需要多少只河蟹。
輸入樣例#1:
3 31 21 3
2 3
輸出樣例#1:
impossible
輸入樣例#2:
3 21 22 3
輸出樣例#2:
1
【資料規模】
1<=n<=10000,1<=m<=100000,任意兩點之間最多有一條道路。
這題質量很高,卡了我一天,最後也是有思路了,然而還是卡了幾次沒過,原來這題可能有不連通的子圖。。。
仔細研究題目之後,我們發現在這樣乙個無向圖中,按照題目要求,每條邊都要被佔據。
如果每條邊都要被佔據,那麼這條邊的兩端點必然有一點佔了乙個河蟹。
也就是說,乙個無向圖中,如果要滿足題目條件,必須滿足在每條邊都被佔據的情況下,每條邊兩端點上不能同時出現河蟹,但是其中有一點要有乙隻河蟹。
題解裡dalao管這思路叫染色,每條邊兩端不能出現相同顏色。
我們可以搜一遍整個圖,記錄每個點是否被染色,以及每種顏色的染色次數。
因為這個顏色具體來說就代表著河蟹的位置,那麼,每次搜尋會得到兩種顏色的解,也就是說河蟹以這兩種方式放置是等價的,我們可以手模檢驗一下。
我們只要取其中最小值就是河蟹的最小數量了。
1 #include2 #include3 #include4 #include5 #include6 #include7#define n 20010
8using
namespace
std;
9int
head[n],tot,n,m;
10bool v[n*100],pr[n*100
];11
int sum[2
];12
struct
nodeg[n*100
];15
void add(int x,int
y)16
2021
bool dfs(int x,int
color)
2228 v[x]=1;pr[x]=color;//
記錄染色狀態
29 sum[color]++;//
記錄染色次數
30bool k=1;//
初始允許訪問
31for(int i=head[x];i&&k;i=g[i].next)
36return
k;37}38
intmain()
3947
int ans=0;48
for(int i=1;i<=n;i++)
4955 ans+=min(sum[0],sum[1]);//
很巧妙乙個地方,小的那乙個一定是河蟹的數量 56}
57 printf("
%d\n
",ans);
58return0;
59 }
2019-05-29 19:25:54
P1330 封鎖陽光大學
曹是乙隻愛刷街的老曹,暑假期間,他每天都歡快地在陽光大學的校園裡刷街。河蟹看到歡快的曹,感到不爽。河蟹決定封鎖陽光大學,不讓曹刷街。陽光大學的校園是一張由n個點構成的無向圖,n個點之間由m條道路連線。每只河蟹可以對乙個點進行封鎖,當某個點被封鎖後,與這個點相連的道路就被封鎖了,曹就無法在與這些道路上...
P1330 封鎖陽光大學
曹是乙隻愛刷街的老曹,暑假期間,他每天都歡快地在陽光大學的校園裡刷街。河蟹看到歡快的曹,感到不爽。河蟹決定封鎖陽光大學,不讓曹刷街。陽光大學的校園是一張由n個點構成的無向圖,n個點之間由m條道路連線。每只河蟹可以對乙個點進行封鎖,當某個點被封鎖後,與這個點相連的道路就被封鎖了,曹就無法在與這些道路上...
P1330 封鎖陽光大學
依題意可知,在圖中的每一條邊有且只有乙個點被選中 阻止老曹刷街 那麼就可以對其採取二分圖染色,一條邊中 乙個點為黑色,另乙個點為白色 如果一條邊中的兩個端點的顏色相同,則說明無解,輸出 ipossible 如果有解,就把白點的數目和黑點的數目取 min 即為答案。include include in...