天梯-红色警报
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. 題意就是 輸入一個圖 然后不斷的從圖里刪除點 如果刪除后聯通情況改變 就輸出紅警 如果聯通清空不變就不必紅警 如果最后一個點也不剩就輸出游戲結束 本題輸出有三種情況 首先統計出初始的聯通分支數l 然后每次刪除點后再算聯通數與初始點進行比較 0 如果這個點一開始就是個孤立點 那么不必紅警只需讓最初統計的聯通數-1 1 如果這個點被刪去后聯通數目不變 那么不必輸出紅色警戒 2 如果這個點被刪去后聯通情況變化 就要紅警第二種情況里 還有變化 就是 如果刪去這個點后聯通分支變多 那么說明一點斷掉了關鍵點 必須紅警如果刪去后聯通數目變少 其實是無影響的 如果一個圖 只因為刪去了一個點從而聯通分支數變少 只能說明 這個點是個非原始的孤立點 那么他的連通分支就他自己 刪去了也無妨 為何是個非原始孤立點 由于原始孤立點已經在0里處理了 深搜判聯通。 #include<bits/stdc++.h> using namespace std; struct edge {int t,next; }e[5010<<1]; int head[550]; bool bok[550];//被攻占的城市標記 bool z[550]={0}; //有沒有走過 int n,m; void dfs(int x) {z[x]=1;for(int i=head[x];~i;i=e[i].next){int t=e[i].t; // cout<<x<<" "<<t<<" "<<z[t]<<bok[t]<<bok[x]<<endl;if(!z[t]&&!bok[t]&&!bok[x]){ // cout<<t<<endl;dfs(t);}} }int hm() {int l=0,c=0;for(int i=0;i<n;i++)z[i]=0;for(int i=0;i<n;i++)//判斷出連同塊 根據后面的遍歷判斷聯通塊 { // cout<<i<<" "<<z[i]<<endl;if(!bok[i])c++;if(!z[i]&&!bok[i]){l++;dfs(i);}} return l; } int main() {cin>>n>>m;memset(head,-1,sizeof(head));for(int i=1;i<=m;i++){int ss,ee;cin>>ss>>ee; e[i].t=ee;e[i].next=head[ss];head[ss]=i;e[i+m].t=ss;e[i+m].next = head[ee];head[ee]=i+m;} int l=0,t,city[550];l=hm(); cin>>t;for(int i=1;i<=t;i++)cin>>city[i];for(int i=1;i<=t;i++){int p=city[i];bok[p]=1;//被攻占 int h = hm();if(head[p]==-1){l--;printf("City %d is lost.\n",p); } else{//聯通塊if(h==l||h<l)printf("City %d is lost.\n",p);else if(h>l)printf("Red Alert: City %d is lost!\n",p); l=h;}if(h==0){printf("Game Over.\n",p); break; }}return 0; }總結
- 上一篇: java查看jar包依赖_java项目开
- 下一篇: user-select属性用法