团体程序设计天梯赛 决赛 L2 红色警报
  t9criyJqIeo6 2023年11月02日 25 0


题目链接:https://www.patest.cn/contests/gplt/L2-013

求联通块的个数,因为时限给的很宽,我们可以每一次都直接重新并查集建图处理,再来统计连通块的个数。


#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 505;
int set[maxn],n;
struct Road
{
int u,v;
}r[maxn*10];
int cmp(Road a,Road b)
{
return a.u < b.u;
}
int find(int x)
{
int r = x;
while(r != set[r])
r = set[r];
return r;
}
void merge(int a,int b)
{
int x = find(a);
int y = find(b);
if(x != y) set[x] = y;
}
void init()
{
for(int i=0; i<n; i++) set[i] = i;
}
int main()
{
int m;
scanf("%d%d", &n,&m);
init();
for(int i=0; i<m; i++)
{
scanf("%d%d", &r[i].u,&r[i].v);
merge(r[i].u,r[i].v);
}
int sum = 0;
for(int i=0; i<n; i++)
if(set[i] == i) sum++;
int q;
scanf("%d", &q);
for(int j=0; j<q; j++)
{
int tmp;
scanf("%d", &tmp);
init();
int num = 0;
for(int i=0; i<m; i++)
{
if(r[i].u == tmp || r[i].v == tmp) r[i].u = maxn-1,num++;
else merge(r[i].u,r[i].v);
}
sort(r,r+m,cmp);
m -= num;
num = 0;
for(int i=0; i<n; i++)
if(set[i] == i) num++;
if(num - sum > 1) printf("Red Alert: ");
printf("City %d is lost",tmp);
if(num - sum > 1) printf("!\n");
else printf(".\n");
sum = num;
if(j == n-1) printf("Game Over.\n");
}
}



【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  rEZj93RghFYQ   2023年11月02日   20   0   0 i++leetcode-java
t9criyJqIeo6
最新推荐 更多