权威的电商网站建设,网站建设费用如何收取,点击出字插件wordpress,一般网站建设用什么样的代码L2-013 红色警报 (25分) 战争中保持各个城市间的连通性非常重要。本题要求你编写一个报警程序#xff0c;当失去一个城市导致国家被分裂为多个无法连通的区域时#xff0c;就发出红色警报。注意#xff1a;若该国本来就不完全连通#xff0c;是分裂的k个区域#xff0c;而…L2-013 红色警报 (25分) 战争中保持各个城市间的连通性非常重要。本题要求你编写一个报警程序当失去一个城市导致国家被分裂为多个无法连通的区域时就发出红色警报。注意若该国本来就不完全连通是分裂的k个区域而失去一个城市并不改变其他城市之间的连通性则不要发出警报。 输入格式
输入在第一行给出两个整数N0 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. #includeiostream
using namespace std;
const int maxn1 500;
const int maxn2 5005;
int count1 0;//统计当前的联通分量个数
int pre[maxn1];
struct edge {int x, y;
}e[maxn2];
int find(int x)//并查集模板查找
{while (x ! pre[x]) x pre[x];return x;
}
void merge(int x, int y)//并查集模板合并
{int a find(x);int b find(y);if (a ! b) pre[a] b;
}
void init()
{for (int i 0; i maxn1; i) pre[i] i;//初始化pre数组
}
int main()
{int n, k, x, y;cin n k;init();for (int i 0; i k; i)//将边存入结构体{cin x y;e[i].x x;e[i].y y;merge(x, y);//合并边}for (int i 0; i n; i){if (pre[i] i)count1;//联通分类个数即独立的块数}int flag[maxn1]{ 0 };int h;cin h;for (int i 0; i h; i){cin x;//输入被攻占城市编号init();flag[x] 1;//标记该城市被攻占int count2 0;//记录被攻占后的城市的联通分量个数for (int z 0; z k; z){if (flag[e[z].x] 0 flag[e[z].y] 0)//如果该道路的两个城市都未被攻占{merge(e[z].x, e[z].y);//合并}}for (int j 0; j n; j){if (pre[j] j flag[j] 0)//如果未被攻占且pre[j]j;{count2;//记录当前的联通分量数}}if (count2 count1)//联通分量大于该城市被攻占前的红色警报printf(Red Alert: City %d is lost!\n, x);else//小于等于只是丢失printf(City %d is lost.\n, x);if (count2 0)printf(Game Over.\n);count1 count2;//被攻占后更新当前的联通分量}
}