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;
}

 

posted @ 2022-01-07 21:27  仙帝-dream  阅读(114)  评论(0)    收藏  举报