3 solutions
-
0
并查集模板 需要判断集合数
#include <bits/stdc++.h> using namespace std; const int N=1e3+7; int fa[N]; int x,y,u,v; void init(){//初始化,每个数看成一个集合 for(int i=1;i<=N;i++) fa[i]=i; } int find(int x){ //这里不能用路劲压缩 if(x==fa[x]) return x; else return find(fa[x]); } void merge(int x,int y)//合并 { u=find(x); v=find(y); if(u!=v) fa[u]=v; } int main(){ int n,m,x,y; while(~scanf("%d%d",&n,&m)&n){ init(); //注意位置 for(int i=0;i<m;i++){ scanf("%d%d",&x,&y); merge(x,y); } int sum=0; for(int i=1;i<=n;i++){ //已经连通的村庄整体算一个集合 if(i==fa[i]) sum++;//!!! } printf("%d\n",sum-1);//n个集合可以看成n个点,连通至少需要n-1条边 } }
Information
- ID
- 1258
- Time
- 1000ms
- Memory
- 128MiB
- Difficulty
- 5
- Tags
- # Submissions
- 110
- Accepted
- 44
- Uploaded By