POJ 2524(并查集)
这道题多了一个检查是否包含所有元素
可以设一个cnt表示集合里的数量,再与外面比较
#include <cstdio> #include <iostream> #include <queue> using namespace std; #define sf scanf #define pf printf #define debug printf("!\n") #define blank printf("\n") #define mem(a,b) memset(a,b,sizeof(a)) const int MaxN = 50010; const int INF = 1<<27; int p[MaxN],a[MaxN]; bool vis[MaxN]; int m,n; int find(int x){return p[x]==x?x:p[x]=find(p[x]);} void Union(int x,int y) { int rx = find(x); int ry = find(y); p[rx] = ry; } int main() { int i,j,k,l,c=0; while(~sf("%d%d",&n,&m),n+m) { i = 0; c++; mem(p,0); mem(vis,false); for(i=1;i<=n;i++) p[i] = i; while(m--) { sf("%d%d",&k,&l); Union(k,l); } int cnt = 0; for(i = 1;i<=n;i++) { if(!vis[find(i)]) { vis[find(i)] = true; cnt++; } } pf("Case %d: %d\n",c,cnt); } return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步