CF659E
传送门。
分析
得出:如果城市之间形成环,就有 00 个孤独城市。
划重点
一个 visit(x)visit(x) ,利用并查集,读入一个点,如果已被标记在一个独立的环当中,标记为 11 。
否则,就合并。
分析
画图发现:如果一个城市已经在一个环里,那另一个直接加入到里面就可以了。
关键
- 并查集来找环。
ACcode(注释版):
```cpp
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<ctime>using namespace std;
int n,m,ans,father[100005],x,y;
bool visit[100005];
//查找父亲
int ss(int x){
return x==father[x]?x:father[x]=ss(father[x]);
}int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
//初始化
father[i]=i;
//每个节点的父亲设为自己
}
for(int i=1;i<=m;i++){
scanf("%d%d",&x,&y);
int tx=ss(x);
int ty=ss(y);
if(tx==ty){//如果父亲一样 (表示两个城市之间联通)
visit[tx]=true;
continue;
}
father[tx]=ty; //(联通城市)使父节点统一
// 若之前已找到过环,就把父亲节点标记为1
if(visit[tx]||visit[ty]){visit[ty]=true;}
}
for(int i=1;i<=n;i++){
if(ss(i)==i&&!visit[i]){ // 满足ss(i)==i的点是父亲节点,另一个就是一颗单独的树。
ans++;
}
}
printf("%d",ans);
return 0;
}
本文来自博客园,作者:仙帝-dream,转载请注明原文链接:https://www.cnblogs.com/yyds123/p/15776911.html

浙公网安备 33010602011771号