题目大意
主要思路
首先在读入两条道路通路时用并查集计算出有多少个连通块,
然后记录下来,接下来再读入每一个失去的国家,每读入一个计算一下当前连通块的个数,当当前连通块的个数比上一次的连通块个数多一或者不变时,说明没有改变连通性,否则改变连通性发出红色警报
AC代码
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <string>
#include <cmath>
#include <queue>
#include <vector>
#include <map>
#include <sstream>
using namespace std;
#define x first
#define y second
const int N = 510, M = 5010;
int p[N], n, m, k;
bool st[N];
pair<int, int> pa[M];
void init()
{
for(int i = 0; i < n; i++) p[i] = i;
}
int count()
{
int cnt = 0;
for(int i = 0; i < n; i++)
{
if(p[i] == i) cnt++;
}
return cnt;
}
int find(int x)
{
if(p[x] != x) p[x] = find(p[x]);
return p[x];
}
int main(void)
{
cin >> n >> m;
init();
for(int i = 0; i < m; i++)
{
int a, b;
cin >> a >> b;
pa[i].x = a, pa[i].y = b;
a = find(a), b = find(b);
if(a != b)
{
p[a] = b;
}
}
int cnt = count();
cin >> k;
for(int i = 0; i < k; i++)
{
init();
int t;
cin >> t;
st[t] = true;
for(int i = 0; i < m; i++)
{
int a = pa[i].x, b = pa[i].y;
if(st[a] || st[b]) continue;
a = find(a), b = find(b);
if(a != b)
{
p[a] = b;
}
}
int cnt1 = count();
if(cnt1 > cnt + 1) printf("Red Alert: City %d is lost!\n", t);
else printf("City %d is lost.\n", t);
cnt = cnt1;
}
if(k == n)
{
cout << "Game Over." << endl;
}
return 0;
}