time limit: 1 second
memory limit: 128 mb
【問題描述】
曹是乙隻愛刷街的老曹,暑假期間,他每天都歡快地在陽光大學的校園裡刷街。河蟹看到歡快的曹,感到不爽。河蟹決定封鎖陽光大學,不讓曹刷街。 陽光大學的校園是一張由n個點構成的無向圖,n個點之間由m條道路連線。每只河蟹可以對乙個點進行封鎖,當某個點被封鎖後,與這個點相連的道路就被封鎖了,曹就無法在與這些道路上刷街了。非常悲劇的一點是,河蟹是一種不和諧的生物,當兩隻河蟹封鎖了相鄰的兩個點時,他們會發生衝突。 詢問:最少需要多少只河蟹,可以封鎖所有道路並且不發生衝突。
【輸入格式】
第一行:兩個整數n,m 接下來m行:每行兩個整數a,b,表示點a到點b之間有道路相連。
【輸出格式】
如果不能夠對大學進封鎖,則輸出impossible,否則輸出所需要的最小河蟹數目。
【資料規模】
1<=n<=10000,1<=m<=100000,任意兩點之間最多有一條道路。
sample input1
3 3
1 2
1 3
2 3sample output1
impossible
sample input2
3 2
1 2
2 3
sample output2
1簡單的方法是對所有點進行染色。
如上圖。在相同的顏色處放河蟹。即可佔據所有的道路。且不會發生衝突。即相鄰點染成不同的顏色。
然後要求最小。就要看在0處放河蟹放得比較少還是在1處會放得比較少。取其中的較小值即可。
然後可能會有多個子圖的情況。注意一下即可。
染色可以用廣搜進行。順便可以判斷會不會出現impossible的情況。
#include
#include
#include
struct node//很久沒打煉表了。練一下。
;int n, m,color[10001],dl[10001],final_ans = 0;//color是給每個點染的顏色。
node *head[10001],*tail[10001];//表示鄰接表的頭結點和尾節點。
bool bo[10001] = ;//判斷某個點是否染色過。
void input_data();
void add(int,int);
void get_ans();
int bfs(int);
void output_ans();
int main()
void output_ans()//輸出最後的答案。
int bfs(int key)//從key點開始廣搜進行染色。
else
if (color[y] == color[x])//如果出度已經染過色且顏色發生衝突。則輸出不可能
temp = temp->next;//尋找下乙個出度。}}
int ans[2];//算出把河蟹放在顏色0和顏色1分別所需要的數目
ans[0] = 0; ans[1] = 0;
for (int i = 1; i <= t; i++)
ans[color[dl[i]]]++;
if (ans[0] > ans[1])//返回其中的較小值 bfs是乙個返回int的函式。
return ans[1];
else
return ans[0];
}void get_ans()
void add(int x, int y)//加入一條邊,從x->y,然後執行add(x,y),add(y,x)就變成無向邊了。
void input_data()
for (int i = 1; i <= m; i++)//輸入圖的資訊。
}
封鎖陽光大學
description 曹是乙隻愛刷街的老曹,暑假期間,他每天都歡快地在陽光大學的校園裡刷街。河蟹看到歡快的曹,感到不爽。河蟹決定封鎖陽光大學,不讓曹刷街。陽光大學的校園是一張由n個點構成的無向圖,n個點之間由m條道路連線。每只河蟹可以對乙個點進行封鎖,當某個點被封鎖後,與這個點相連的道路就被封鎖了...
封鎖陽光大學
曹是乙隻愛刷街的老曹,暑假期間,他每天都歡快地在陽光大學的校園裡刷街。河蟹看到歡快的曹,感到不爽。河蟹決定封鎖陽光大學,不讓曹刷街。陽光大學的校園是一張由n個點構成的無向圖,n個點之間由m條道路連線。每只河蟹可以對乙個點進行封鎖,當某個點被封鎖後,與這個點相連的道路就被封鎖了,曹就無法在與這些道路上...
C P1330 封鎖陽光大學
曹是乙隻愛刷街的老曹,暑假期間,他每天都歡快地在陽光大學的校園裡刷街。河蟹看到歡快的曹,感到不爽。河蟹決定封鎖陽光大學,不讓曹刷街。陽光大學的校園是一張由n個點構成的無向圖,n個點之間由m條道路連線。每只河蟹可以對乙個點進行封鎖,當某個點被封鎖後,與這個點相連的道路就被封鎖了,曹就無法在與這些道路上...