hdu 1272 使用set和并查集
2024-10-08 01:20:50
http://acm.hdu.edu.cn/showproblem.php?pid=1272
这道题就是求图是不是连通无环,我觉得其实就是看看图是不是一棵最小生成树。
所以要是图满足条件,就必然有n个节点,n-1条边。但是题目中若只有 0 0一组数据也是可以的!!!!!这里WA了好多回。
所以我首先采用stl里面的set来直接判断:
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<set>
#include<cstring>
using namespace std;
const int maxn = ;
int n, m; int main()
{
set<int> s;
int x, y;
int tot = ;
while (scanf("%d%d", &x, &y) == )
{
if (x == - && y == -) break;
if (x == && y == ) printf("Yes\n");//!!!特判一下!!!
else
{
tot++, s.insert(x), s.insert(y);//把点加入set,tot计录边的数目
for (int i = ;; i++) {
scanf("%d%d", &x, &y);
if (x == && y == ) {
if (s.size() == tot + )
printf("Yes\n");
else
printf("No\n");
s.clear();
tot = ;
break;
}
s.insert(x), s.insert(y);
tot++;
}
}
}
return ;
}
当然,原本的做法是用并查集,效率比set高很多:
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<set>
#include<cstring>
using namespace std;
const int maxn=;
int n,m;
int f[maxn],flag[maxn]; int find(int x)
{
return f[x]==x?x:f[x]=find(f[x]);
} int Union(int x,int y)
{
int rx=find(x);
int ry=find(y);
if (rx==ry){
return ;
}else{
f[rx]=ry;
return ;
}
} int main()
{
int x,y,t,Flag;
while(scanf("%d%d",&x,&y)==)
{
memset(flag,,sizeof(flag));
for (int i=;i<=maxn;i++) f[i]=i;
if (x==-&&y==-) break;
if (x==&&y==) printf("Yes\n");
else
{
Union(x,y);
flag[x]=,flag[y]=;//记录点已在图中
t=,Flag=;//开始存在一棵树。没有环。
while(scanf("%d%d",&x,&y)==)
{
if (x==&&y==) break;
if (flag[x]==){t++,flag[x]=;}//x是新节点,树+1
if (flag[y]==){t++,flag[y]=;}//y是新节点,树+1
if (Union(x,y)==) Flag=;//存在回路
else t--;//x,y合并,树-1
}
if (Flag&&t==) printf("Yes\n");
else printf("No\n");
}
}
return ;
}
最新文章
- Android带加减的edittext
- window.hostory(浏览器的历史记录)
- Android sqlite数据库自定义存放路径办法参考(未验证)
- css居中完全指南(翻译)
- SharePoint 2013 本地开发解决方案以及远程调试
- September 22nd 2016 Week 39th Thursday
- linux基本命令(2)-备份压缩命令
- java的动态代理机制
- PHP输出
- iOS 并行编程:Thread
- javascript 正则匹配手机号码
- paip.输入法编程---增加码表类型
- PHP的日志记录-错误与异常记录
- Python自学知识点----Day01
- Javascript 继承和多态
- django 富文本编辑器
- 【Apache运维基础(6)】Apache的日志管理与分析
- 有时候做JQ动画,鼠标经过,它会不停自己抖动不停,解决方法(此处,是兼容IE ,当鼠标经过,遮罩层从下移到上边的JQ动画效果)
- 通过反射实现IOC功能
- HDU2966 In case of failure(浅谈k-d tree)
热门文章
- ETH功能类
- linux下定位文件
- CSS3的transform 转换
- mac 终端 常用命令,MacOS 常用终端命令大全,mac 在当前目录打开终端
- 【cml】wosi-demo
- 高可用服务 AHAS 在消息队列 MQ 削峰填谷场景下的应用
- Django项目:CRM(客户关系管理系统)--13--05PerfectCRM实现King_admin注册功能获取内存02
- NLTK的探索
- Thinkphp 不足之处
- python 中if __name__==";__main__";