洛谷 P1536 村村通
程序员文章站
2022-07-01 17:04:55
[TOC] 题目 "P1536 村村通" 思路 并查集,一开始连通快的数量为$n$,输入$m$条边时如果该边起点和终点不在同一联通块内就合并并让联通块数量减一,最后输出联通块数量减一。 $Code$ cpp include include include include include define ......
目录
题目
思路
并查集,一开始连通快的数量为$n$,输入$m$条边时如果该边起点和终点不在同一联通块内就合并并让联通块数量减一,最后输出联通块数量减一。
$code$
#include<iostream> #include<cstring> #include<string> #include<cstdio> #include<algorithm> #define maxn 1001 using namespace std; int n,m; int fa[maxn]; int find(int x){ return fa[x]==x?x:fa[x]=find(fa[x]); } inline int read(){ int x=0;bool f=0;char c=getchar(); while(c<'0'||c>'9'){if(c=='-')f=!f;c=getchar();} while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();} return f?-x:x; } int main(){ while(1){ n=read(); for(int i=1;i<=n;++i) fa[i]=i; if(n==0) break; int ub=n; m=read(); if(m==0){ printf("%d\n",n-1); continue; } for(int i=1,x,y;i<=m;++i){ x=read(),y=read(); if(find(x)!=find(y)){ fa[find(x)]=find(y); ub--; } } printf("%d\n",ub-1); } return 0; }
上一篇: 洛谷 P1396 营救