問題描述
抗日戰爭時期,冀中平原的地道戰曾發揮重要作用。
地道的多個站點間有通道連線,形成了龐大的網路。但也有隱患,當敵人發現了某個站點後,其它站點間可能因此會失去聯絡。
我們來定義乙個危險係數df(x,y):
對於兩個站點x和y (x != y), 如果能找到乙個站點z,當z被敵人破壞後,x和y不連通,那麼我們稱z為關於x,y的關鍵點。相應的,對於任意一對站點x和y,危險係數df(x,y)就表示為這兩點之間的關鍵點個數。
本題的任務是:已知網路結構,求兩站點之間的危險係數。
輸入格式
輸入資料第一行包含2個整數n(2 <= n <= 1000), m(0 <= m <= 2000),分別代表站點數,通道數;
接下來m行,每行兩個整數 u,v (1 <= u, v <= n; u != v)代表一條通道;
最後1行,兩個數u,v,代表詢問兩點之間的危險係數df(u, v)。
輸出格式
乙個整數,如果詢問的兩點不連通則輸出-1.
樣例輸入
7 61 3
2 33 4
3 54 5
5 61 6
樣例輸出
2解題思路:
若不聯通說明與此邊的點為關鍵點。注意讓避免重複計算某點,且要排除u,v。
1 #include2view code3const
int max_n = 1000;4
const
int max_m = 2000;5
6int
n,m;
7int u[max_m],v[max_m]; //
儲存通道兩點
8int u,v; //
待查詢 910
int par[max_n+1
];11
int rank[max_n+1
];12
13bool used[max_n+1
];14
15void init( int
n )1622}
2324
int find( int
x )25
29return par[x] =find( par[x] );30}
3132
void unite( int x, int
y)33
38if( rank[x]
41else46}
47}4849
bool same( int x, int
y )50
5354
void
solve()
5561
if( !same(u,v) )
6566
//每次判處下標為i的通道 用並查集判斷關鍵點
67int res = 0;68
for( int i=0; i)
6977
if( !same(u,v) )
82if( !used[v[i]] )86}
87}88if( used[u] ) res--;
89if( used[v] ) res--;
9091 printf("
%d\n
",res);92}
9394
intmain()
95101 scanf("
%d%d
",&u,&v);
102103
solve();
104105
return0;
106 }
1 #include2 #include3view codeusing
namespace
std;45
const
int max_n = 1000;6
const
int max_m = 2000;7
8//輸入 9
intn,m;
10int
u,v;
11 vector g[max_n+1]; //圖12
13bool visited[max_n+1]; //
visited[i]:在當前dfs()中是否訪問過i
14int count[max_n+1]; //
count[i]:下標i出現在u-v路徑中的次數
15int sum; //
計算所有路徑數
1617
bool dfs( int
x )18
2324
bool flag = false;25
for( int i=0; i)
2635 visited[x_] = false
;
36} 37}
38return
flag;39}
4041
void
solve()
4249
50int res = 0;51
for( int i=1; i<=n; i++)
5256}57
58if( count[u]==sum ) res--;//
多記錄了u
5960 printf("
%d\n
",res); 61}
6263
intmain()
6472 scanf("
%d%d
",&u,&v);
7374
solve();
7576
return0;
77 }
1 #include2 #include3view codeusing
namespace
std;45
const
int max_n = 1000;6
const
int max_m = 2000;7
8//輸入 9
intn,m;
10int
u,v;
11 vector g[max_n+1]; //圖12
13bool visited[max_n+1]; //
visited[i]:在當前dfs()中是否訪問過i
14int count[max_n+1]; //
count[i]:下標i出現在u-v路徑中的次數
15int sum; //
計算所有路徑數
1617
int way[max_n]; //
記錄路徑節點
1819
void dfs( int x , int
index )
2026
return;27
}2829 way[index] =x;
30for( int i=0; i)31
39}40}
4142
void
solve()
4352
53int res = 0;54
for( int i=1; i<=n; i++)
5559}60
61 printf("
%d\n
",res-1); //
多記錄了節點u 62}
6364
intmain()
6573 scanf("
%d%d
",&u,&v);
7475
solve();
7677
return0;
78 }
歷屆試題 危險係數 藍橋杯
問題描述 抗日戰爭時期,冀中平原的地道戰曾發揮重要作用。地道的多個站點間有通道連線,形成了龐大的網路。但也有隱患,當敵人發現了某個站點後,其它站點間可能因此會失去聯絡。我們來定義乙個危險係數df x,y 對於兩個站點x和y x y 如果能找到乙個站點z,當z被敵人破壞後,x和y不連通,那麼我們稱z為...
藍橋杯 歷屆試題 危險係數
歷屆試題 危險係數 問題描述 抗日戰爭時期,冀中平原的地道戰曾發揮重要作用。地道的多個站點間有通道連線,形成了龐大的網路。但也有隱患,當敵人發現了某個站點後,其它站點間可能因此會失去聯絡。我們來定義乙個危險係數df x,y 對於兩個站點x和y x y 如果能找到乙個站點z,當z被敵人破壞後,x和y不...
藍橋杯 歷屆試題 危險係數
問題 1433 藍橋杯 歷屆試題 危險係數 時間限制 1sec 記憶體限制 128mb 提交 122 解決 38 題目描述 問題描述 抗日戰爭時期,冀中平原的地道戰曾發揮重要作用。地道的多個站點間有通道連線,形成了龐大的網路。但也有隱患,當敵人發現了某個站點後,其它站點間可能因此會失去聯絡。我們來定...