旅遊景點 (並查集)

旅遊景點

描述 Description
liouzhou_101住在柳侯公園附近,閒暇時刻都會去公園散散步。
很那啥的就是,柳侯公園的道路太凌亂了,假若不認識路就會走着走着繞回原來的那條路。
liouzhou_101就開始自己YY,假若給他當上那啥管理者,就會想盡量減少道路迴圈的個數,但是大範圍的改變道路終歸不是什麼良策。
經過調查,發現公園有N個景點,爲了顯示景點之間的優越性,我們按照1,2,…,N來把這N個景點編號,當然編號越小就說明越重要。
爲了顯示自己的英明決策,liouzhou_101決定,前K重要的景點最爲重要,當然他們是標號爲1…K了的。需要保證這K個景點不在任何一個環上,原因很簡單,這前K個景點是很重要的景點,參觀的人也很多,自然不會希望參觀的人因爲在兜圈子而迷路吧。
於是,我們所能夠做的就是把之前建造好的一些道路清除掉,使得保證前K重要的景點不在任何一個環上。

輸入格式 InputFormat
第一行包括三個正整數N,M和K,N表示景點的數量,M表示公園裏的路徑條數,K表示前K個景點最爲重要。
再接下來M行,每行有兩個正整數x和y,表示景點x和景點y之間有一條邊。

輸出格式 OutputFormat
僅一行,輸出至少去除多少條路徑,使得前K個重要的景點不在任何一個環上。
樣例輸入
11 13 5
1 2
1 3
1 5
3 5
2 8
4 11
7 11
6 10
6 9
2 3
8 9
5 9
9 10

樣例輸出

3

數據範圍和註釋 Hint
我們的刪邊方案是,刪除(2,3)(5,9)(3,5)這三條邊,這樣節點1到5都不在任何一個環上。
而且可知刪除三條邊已經是最少的了。

30%的數據,滿足N≤10,M≤20;
60%的數據,滿足N≤1,000,M≤10,000;
100%的數據,滿足N≤100,000,M≤200,000。
注意:給出的無向圖可能有重邊和自環。

讀入數據的時候,如果一條路的兩端都不在k的範圍內,那麼就可以直接合並,如果有一端在k之內,那麼需要判斷這兩個端點是否已經在同一個集合中了,如果不在,可以合併,否則這就是一條需要出去的路徑。

program mys;

var i,j,k,m,n,t:longint;
f,x,y:array[0..1000000]of longint;

function find(x:longint):longint;
begin 
if f[x]<>x then f[x]:=find(f[x]);
exit(f[x]);
end;

procedure union(x,y:longint);
begin 
x:=find(x);
y:=find(y);
if x<>y then f[x]:=y;
end;

begin 
assign(input,'tou.in'); reset(input);
assign(output,'tou.out'); rewrite(output);
readln(n,m,k);
for i:=1 to m do 
readln(x[i],y[i]);

for i:=1 to n do 
f[i]:=i;

for i:=1 to m do 
if (x[i]>k)and(y[i]>k) then 
union(x[i],y[i]);

for i:=1 to m do 
if (x[i]<=k)or(y[i]<=k) then 
if find(x[i])=find(y[i]) then 
inc(t)
else union(x[i],y[i]);

writeln(t);
close(input);
close(output);
end.

發佈了33 篇原創文章 · 獲贊 3 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章