題目鏈結
思路:利用並查集,每次刪完結點,統計連通塊,如果比原來多了1塊及以上,則說明出現連通塊**,該節點對其他節點有影響,因為我在題目中統計連通塊的方式是遍歷對於所有結點的root陣列,是-1則連通塊加一,但刪除該點後還是會統計到這個點為連通塊,故題目中的判斷是刪後連通塊》原連通塊+1。
#include
#include
#include
#include
using
namespace std;
const
int max =
5e2+5;
int root[max]
;bool _map[max]
[max]
;bool vis[max]
;int n, m;
intfind_root
(int x)
//優化版並查集,會將該節點並到最深入的那個根上
void
union_root
(int a,
int b)
else}}
//將root陣列置為-1,負數代表該節點的子節點個數
void
init
(int n)
intmain()
int k,edge;
for(
int i =
0; i < n; i++)if
(root[i]
<0)
original++
;scanf
("%d"
,& k)
;int k = k;
while
(k--
)for
(int i =
0; i < n; i++
)for
(int j =
0; j < n; j++)if
(_map[i]
[j])
union_root
(i, j)
;for
(int i =
0; i < n; i++)if
(root[i]
<0)
after++;if
(after>original+1)
printf
("red alert: city %d is lost!\n"
,edge)
;else
printf
("city %d is lost.\n"
, edge)
; original = after;
after =0;
}if(k == n)
printf
("game over.");
}
7 9 紅色警報
輸入在第一行給出兩個整數n 0 n 500 和m 5000 分別為城市個數 於是預設城市從0到n 1編號 和連線兩城市的通路條數。隨後m行,每行給出一條通路所連線的兩個城市的編號,其間以1個空格分隔。在城市資訊之後給出被攻占的資訊,即乙個正整數k和隨後的k個被攻占的城市的編號。注意 輸入保證給出的被...
紅色警報(25分)
戰爭中保持各個城市間的連通性非常重要。本題要求你編寫乙個報警程式,當失去乙個城市導致國家被 為多個無法連通的區域時,就發出紅色警報。注意 若該國本來就不完全連通,是 的k個區域,而失去乙個城市並不改變其他城市之間的連通性,則不要發出警報。輸入在第一行給出兩個整數n 0 n 500 和m 5000 分...
紅色警報 25分
戰爭中保持各個城市間的連通性非常重要。本題要求你編寫乙個報警程式,當失去乙個城市導致國家被 為多個無法連通的區域時,就發出紅色警報。注意 若該國本來就不完全連通,是 的k個區域,而失去乙個城市並不改變其他城市之間的連通性,則不要發出警報。輸入格式 輸入在第一行給出兩個整數n 0 n 500 和m 5...