标签:编写 代码 cstring val iostream 连通 content over 对比
战争中保持各个城市间的连通性非常重要。本题要求你编写一个报警程序,当失去一个城市导致国家被分裂为多个无法连通的区域时,就发出红色警报。注意:若该国本来就不完全连通,是分裂的k个区域,而失去一个城市并不改变其他城市之间的连通性,则不要发出警报。
输入格式:
输入在第一行给出两个整数N(0 < N <=500)和M(<=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.
1 #include<iostream> 2 #include<cstring> 3 4 using namespace std; 5 6 bool visited[505]; 7 int edge[505][505]; 8 int n,m,k; 9 10 void dfs(int pos) 11 { 12 visited[pos]=true; 13 for(int i = 0; i < n; i++) 14 { 15 if(visited[i]==false && edge[pos][i]) 16 dfs(i); 17 } 18 } 19 int all() 20 { 21 int con=0; 22 for(int i = 0; i < n; i++) 23 { 24 if(visited[i]==false) 25 dfs(i),con++; 26 } 27 return con; 28 } 29 int main() 30 { 31 int from,to; 32 cin>>n>>m; 33 memset(edge,0,sizeof(edge)); 34 for(int i = 0; i < m; i++) 35 { 36 cin>>from>>to; 37 edge[from][to]=1; 38 edge[to][from]=1; 39 } 40 int con = all(); 41 cin>>k; 42 int city,temp; 43 for(int j = 1; j <= k; j++) 44 { 45 cin>>city; 46 for(int i = 0; i < n; i++) 47 { 48 if(edge[city][i]) 49 edge[city][i]=0,edge[i][city]=0; 50 } 51 memset(visited,false,sizeof(visited)); 52 temp = all(); 53 if(temp>con+1) 54 cout<<"Red Alert: City "<<city<<" is lost!"<<endl; 55 else 56 cout<<"City "<<city<<" is lost."<<endl; 57 con=temp; 58 } 59 if(k==n) 60 cout<<"Game Over."<<endl; 61 return 0; 62 }
标签:编写 代码 cstring val iostream 连通 content over 对比
原文地址:http://www.cnblogs.com/Xycdada/p/6551095.html