5 9 紅色警報 25分

2021-07-28 22:24:52 字數 1667 閱讀 3466

5-9 紅色警報 (25分)

戰爭中保持各個城市間的連通性非常重要。本題要求你編寫乙個報警程式,當失去乙個城市導致國家被**為多個無法連通的區域時,就發出紅色警報。注意:若該國本來就不完全連通,是**的k個區域,而失去乙個城市並不改變其他城市之間的連通性,則不要發出警報。

輸入格式:

輸入在第一行給出兩個整數n(0 << n \le≤ 500)和m(\le≤ 5000),分別為城市個數(於是預設城市從0到n-1編號)和連線兩城市的通路條數。隨後m行,每行給出一條通路所連線的兩個城市的編號,其間以1個空格分隔。在城市資訊之後給出被攻占的資訊,即乙個正整數k和隨後的k個被攻占的城市的編號。

注意:輸入保證給出的被攻占的城市編號都是合法的且無重複,但並不保證給出的通路沒有重複。

輸出格式:

對每個被攻占的城市,如果它會改變整個國家的連通性,則輸出red alert: city k is lost!,其中k是該城市的編號;否則只輸出city k is lost.即可。如果該國失去了最後乙個城市,則增加一行輸出game over.。

輸入樣例:

5 4

0 1

1 3

3 0

0 4

5 1 2 0 4 3

輸出樣例:

city 1 is lost.

city 2 is lost.

red alert: city 0 is lost!

city 4 is lost.

city 3 is lost.

game over.

這裡是用搜尋實現的

分析:並查集

#include

#include

using

namespace

std;

struct edge;

int pre[505];

int lost [5001];

struct edge e[5005];

int find(int x)

int i=x,j;

while(pre[i]!=r)//壓縮

return r;

}void join(int x,int y)

}int main()

total=0;

cin>>n>>m;

for (int i=0;icin>>x>>y;

e[i].x=x;

e[i].y=y;

join(x,y);

}for (int i=0;iif (pre[i]==i)

}cin>>k;

for (int i=0;ifor (int i=0;i<505;i++)

cin>>city;

total2=0;

lost[city]=1;

for (int j=0;jif (lost[e[j].x]!=1&&lost[e[j].y]!=1)

}for (int h =0;hif (pre[h]==h&&lost[h]!=1)

}if (total==total2||total2+1==total)

else

total=total2;

}if(k==n)

printf("game over.\n");

return

0;}

紅色警報(25分)

戰爭中保持各個城市間的連通性非常重要。本題要求你編寫乙個報警程式,當失去乙個城市導致國家被 為多個無法連通的區域時,就發出紅色警報。注意 若該國本來就不完全連通,是 的k個區域,而失去乙個城市並不改變其他城市之間的連通性,則不要發出警報。輸入在第一行給出兩個整數n 0 n 500 和m 5000 分...

紅色警報 25分

戰爭中保持各個城市間的連通性非常重要。本題要求你編寫乙個報警程式,當失去乙個城市導致國家被 為多個無法連通的區域時,就發出紅色警報。注意 若該國本來就不完全連通,是 的k個區域,而失去乙個城市並不改變其他城市之間的連通性,則不要發出警報。輸入格式 輸入在第一行給出兩個整數n 0 n 500 和m 5...

7 9 紅色警報 25分

戰爭中保持各個城市間的連通性非常重要。本題要求你編寫乙個報警程式,當失去乙個城市導致國家被 為多個無法連通的區域時,就發出紅色警報。注意 若該國本來就不完全連通,是 的k個區域,而失去乙個城市並不改變其他城市之間的連通性,則不要發出警報。輸入在第一行給出兩個整數n 0 n 500 和m 5000 分...