P1330 封鎖陽光大學 並查集 1

2021-09-11 10:35:04 字數 1552 閱讀 3352

曹是乙隻愛刷街的老曹,暑假期間,他每天都歡快地在陽光大學的校園裡刷街。河蟹看到歡快的曹,感到不爽。河蟹決定封鎖陽光大學,不讓曹刷街。

陽光大學的校園是一張由n個點構成的無向圖,n個點之間由m條道路連線。每只河蟹可以對乙個點進行封鎖,當某個點被封鎖後,與這個點相連的道路就被封鎖了,曹就無法在與這些道路上刷街了。非常悲劇的一點是,河蟹是一種不和諧的生物,當兩隻河蟹封鎖了相鄰的兩個點時,他們會發生衝突。

詢問:最少需要多少只河蟹,可以封鎖所有道路並且不發生衝突。

輸入格式:

第一行:兩個整數n,m

接下來m行:每行兩個整數a,b,表示點a到點b之間有道路相連。

輸出格式:

僅一行:如果河蟹無法封鎖所有道路,則輸出「impossible」,否則輸出乙個整數,表示最少需要多少只河蟹。

輸入樣例#1:複製

3 3

1 21 3

2 3

輸出樣例#1:複製

impossible
輸入樣例#2:複製

3 2

1 22 3

輸出樣例#2:複製

1
【資料規模】

1<=n<=10000,1<=m<=100000,任意兩點之間最多有一條道路。

說明

1 剛開始感覺和無線廣播那個題目很相似,

2 但是**提交了,存在以下幾個問題

(1) 這裡不是全部連通的,其實可以分為幾個連通,需要分別統計

(2)必須呼叫 fa(i)才能得到最根部。

#include#include#include #include #include using namespace std;

int f[10002],d[10002],n,m; //f儲存祖先節點,d儲存到其祖先節點的路徑長。

int fa(int x)

return f[x];

}bool check(int a,int b)

//這樣設定之後,會將x和y同步}

else

; //若已連線,則判斷。

}return true;

}int main()

;//檢查當前兩點是否已有邊相連線。

}if(!res)

cout<<"impossible"vectorallsum;

vectorzsum;

for (i=1; i<=n; i++)

}if(index==-1)

else

}for(int i=0; icout<}

return 0;

}

P1330 封鎖陽光大學

曹是乙隻愛刷街的老曹,暑假期間,他每天都歡快地在陽光大學的校園裡刷街。河蟹看到歡快的曹,感到不爽。河蟹決定封鎖陽光大學,不讓曹刷街。陽光大學的校園是一張由n個點構成的無向圖,n個點之間由m條道路連線。每只河蟹可以對乙個點進行封鎖,當某個點被封鎖後,與這個點相連的道路就被封鎖了,曹就無法在與這些道路上...

P1330 封鎖陽光大學

曹是乙隻愛刷街的老曹,暑假期間,他每天都歡快地在陽光大學的校園裡刷街。河蟹看到歡快的曹,感到不爽。河蟹決定封鎖陽光大學,不讓曹刷街。陽光大學的校園是一張由n個點構成的無向圖,n個點之間由m條道路連線。每只河蟹可以對乙個點進行封鎖,當某個點被封鎖後,與這個點相連的道路就被封鎖了,曹就無法在與這些道路上...

P1330 封鎖陽光大學

依題意可知,在圖中的每一條邊有且只有乙個點被選中 阻止老曹刷街 那麼就可以對其採取二分圖染色,一條邊中 乙個點為黑色,另乙個點為白色 如果一條邊中的兩個端點的顏色相同,則說明無解,輸出 ipossible 如果有解,就把白點的數目和黑點的數目取 min 即為答案。include include in...