題目描述
因為某國被某紅色政權殘酷的高壓暴力統治。美國派出將軍uim,對該國進行戰略性措施,以解救塗炭的生靈。
該國有n個城市,這些城市以鐵路相連。任意兩個城市都可以通過鐵路直接或者間接到達。
uim發現有些鐵路被毀壞之後,某兩個城市無法互相通過鐵路到達。這樣的鐵路就被稱為key road。
uim為了盡快使該國的物流系統癱瘓,希望炸毀鐵路,以達到存在某兩個城市無法互相通過鐵路到達的效果。
然而,只有一發炮彈(美國國會不給錢了)。所以,他能轟炸哪一條鐵路呢?
輸入格式
第一行n,m(1<=n<=150, 1<=m<=5000),分別表示有n個城市,總共m條鐵路。
以下m行,每行兩個整數a, b,表示城市a和城市b之間有鐵路直接連線。
輸出格式
輸出有若干行。
每行包含兩個數字a,b(a是key road。
請注意:輸出時,所有的數對必須按照a從小到大排序輸出;如果a相同,則根據b從小到大排序。
輸入輸出樣例
輸入 #1
6 61 2
2 32 4
3 54 5
5 6輸出 #1
1 25 6
原本是按照最短路的標籤找題目來做的,
然後就找到了這一題,但是仔細看看題目其實我認為用並查集來做會更易於理解簡單一點吧。
我們來迴圈列舉每條鐵路,然後每次把除了這條鐵路外的其他鐵路的點都用並查集儲存起來。這個時候再用並查集來判斷根節點為自己的結點有多少個,如果根結點等於自己數量大於等於2(則說明至少有兩顆子樹),就說明如果不將這條鐵路連起來會產生有結點不能通行,再輸出。
輸出有個坑點,首先要按照a的大小順序,如果a相同就按b的大小順序。
而且如果a>b就要交換順序,不交換順序只能拿70。
**:
#include
#include
#include
using
namespace std;
int n,a[
1001][
3],fa[
1001
],m,top;
struct czp
c[10001];
intfind
(int x)
//並查集路徑壓縮
inthe
(int x,
int y)
//並查集將兩個子樹合併
voidcs(
)int
cmp(czp a,czp b)
intmain()
int t=0;
for(
int j=
1;j<=n;j++)if
(fa[j]
==j)
t++;if
(t>=2)
//如果子樹數量大於2就說明肯定有結點沒有連線在一起
}sort
(c+1
,c+top+
1,cmp)
;//按照題目要求排序輸出
for(
int i=
1;i<=top;i++
)printf
("%d %d\n"
,c[i]
.x,c[i]
.y);
return0;
}
洛谷P1656 炸鐵路
洛谷p1656 因為某國被某紅色政權殘酷的高壓暴力統治。美國派出將軍uim,對該國進行戰略性措施,以解救塗炭的生靈。該國有n個城市,這些城市以鐵路相連。任意兩個城市都可以通過鐵路直接或者間接到達。uim發現有些鐵路被毀壞之後,某兩個城市無法互相通過鐵路到達。這樣的鐵路就被稱為key road。uim...
洛谷 P1656 炸鐵路
題目描述 因為某國被某紅色政權殘酷的高壓暴力統治。美國派出將軍uim,對該國進行戰略性措施,以解救塗炭的生靈。該國有n個城市,這些城市以鐵路相連。任意兩個城市都可以通過鐵路直接或者間接到達。uim發現有些鐵路被毀壞之後,某兩個城市無法互相通過鐵路到達。這樣的鐵路就被稱為key road。uim為了盡...
洛谷 P1656 炸鐵路
題目描述 因為某國被某紅色政權殘酷的高壓暴力統治。美國派出將軍uim,對該國進行戰略性措施,以解救塗炭的生靈。該國有n個城市,這些城市以鐵路相連。任意兩個城市都可以通過鐵路直接或者間接到達。uim發現有些鐵路被毀壞之後,某兩個城市無法互相通過鐵路到達。這樣的鐵路就被稱為key road。uim為了盡...