POJ 2524 Ubiquitous Religions (并差集)
http://acm.pku.edu.cn/JudgeOnline/problem?id=2524
#include <iostream>//对并差集的不熟悉
#include <cstdio>
using namespace std;
long p[50010],n,m,tmp,rel[50010];
long getRoot(long big)//压缩路径+返回根结点
{
if(p[big]==big) return big;
else return p[big]=getRoot(p[big]);
}
int main()
{
long small,big,count=0,ans,i,bigRoot,smallRoot;
while(scanf("%ld%ld",&n,&m),(n||m))
{
for(i=1;i<=n;i++) p[i]=i;
while(m--)
{
scanf("%ld%ld",&small,&big);
if(small>big)
{
tmp=small;
small=big;
big=tmp;
}
if(p[big]==big) p[big]=small;
else
{
bigRoot=getRoot(big);
smallRoot=getRoot(small);?
//合并树的时候,需要找到根结点进行合并,
//每个点要看成一棵树的一部分,不断合并,而不能仅仅看成点
if(smallRoot<bigRoot) p[bigRoot]=smallRoot;
else p[smallRoot]=bigRoot;
}
}
for(i=1;i<=n;i++) getRoot(i);
memset(rel,0,sizeof(rel));
for(i=1;i<=n;i++) rel[p[i]]=1;
ans=0;
for(i=1;i<=n;i++) ans+=rel[i];
printf("Case %ld: %ld\n",++count,ans);
}
return 0;
}
posted on 2010-03-05 10:17 liugoodness 阅读(293) 评论(0) 编辑 收藏 举报
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述