hdu3926(判断两个图是否相似,模版)
题意:给你2个图,最大度为2.问两个图是否相似。
思路:图中有环、有链,判断环的个数以及每个环组成的人数,还有链的个数以及每个链组成的人数 是否相等即可。
如果形成了环,那么每形成一个环,结点数就会多增加1,如果没形成环,那么结点数就会是一样,根据这里,引入set来写,会轻松很多。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<set>
#include<algorithm>
using namespace std;
int father[100000],p[100000],sum[100000];
int find(int x)
{
int i=x,root;
while(x!=father[x])
x=father[x];
root=x;
x=i;
while(x!=father[x])
{
i=father[x];
father[x]=root;
sum[root]=sum[root]+sum[x];
p[root]=p[root]+p[x];
sum[x]=0;
p[x]=0;
x=i;
}
return root;
}
void liantong(int x,int y)
{
if(x!=y)
{
father[x]=y;
sum[y]+=sum[x];
p[y]+=p[x];
sum[x]=0;
p[x]=0;
}
else
{
p[x]++;
}
}
int main()
{
int text,f=1;
scanf("%d",&text);
while(text--)
{
set<int>cir,li;
int n,m;
scanf("%d%d",&n,&m);
for(int i=0;i<=n;i++)
{
father[i]=i;
p[i]=1;
sum[i]=1;
}
for(int i=1;i<=m;i++)
{
int tmp,tmp1;
scanf("%d%d",&tmp,&tmp1);
if(tmp==tmp1) continue;
tmp=find(tmp);
tmp1=find(tmp1);
liantong(tmp,tmp1);
}
for(int i=1;i<=n;i++)
{
if(p[i]==sum[i])
{
li.insert(p[i]);
}
else
{
cir.insert(p[i]);
}
}
int ans1=li.size(),ans2=cir.size();
scanf("%d%d",&n,&m);
for(int i=0;i<=n;i++)
{
father[i]=i;
p[i]=1;
sum[i]=1;
}
for(int i=1;i<=m;i++)
{
int tmp,tmp1;
scanf("%d%d",&tmp,&tmp1);
if(tmp==tmp1) continue;
tmp=find(tmp);
tmp1=find(tmp1);
liantong(tmp,tmp1);
}
for(int i=1;i<=n;i++)
{
if(p[i]==sum[i])
{
li.insert(p[i]);
}
else
{
cir.insert(p[i]);
}
}
//printf("%d %d\n%d %d\n",ans1,ans2,cir.size(),li.size()); if(cir.size()==ans2&&li.size()==ans1)
printf("Case #%d: YES\n",f++);
else
printf("Case #%d: NO\n",f++);
}
return 0;
}
hdu3926(判断两个图是否相似,模版)的更多相关文章
- OpenCV——直方图计算、寻早最值位置和对比匹配(判断两幅图的相似程度)
- Javscript轮播 支持平滑和渐隐两种效果(可以只有两张图)
原文:Javscript轮播 支持平滑和渐隐两种效果(可以只有两张图) 先上两种轮播效果:渐隐和移动 效果一:渐隐 1 2 3 4 效果二:移动 1 2 3 4 接下来,我们来大致说下整个轮播的思 ...
- You can Solve a Geometry Problem too (hdu1086)几何,判断两线段相交
You can Solve a Geometry Problem too Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/3276 ...
- Oracle判断两个时间段是否相交
SQL中常常要判断两个时间段是否相交,该如何判断呢?比如两个时间段(S1,E1)和(S2,E2).我最先想到的是下面的方法一.方法一:(S1 BETWEEN S2 AND E2) OR (S2 BET ...
- 9-2、大型项目的接口自动化实践记录----递归判断两个json串是否相等
1.已知json串构成的情况下判断 先构造一下场景,假设已经把各个数据都移除掉不对比的字段 图1 预期.实际结果,复杂接口返回多层嵌套json时,同下 图2 预期.实际结果值为:{child_json ...
- 简单地判断判断两矩形相交/重叠 C#
最近需要用到矩形相交算法的简单应用,所以特地拿一个很简单的算法出来供新手参考,为什么说是给新手的参考呢因为这个算法效率并不是很高,但是这个算法只有简简单单的三行.程序使用了两种方法来判断是否重叠/相交 ...
- 如何判断两个IP地址是不是处于同一网段?
个人理解,欢迎指正. 一.要判断两个IP地址是不是在同一个网段,就将它们的IP地址分别与子网掩码做与运算,得到的结果-->网络号,如果网络号相同, 就在同一子网,否则,不在同一子网. 例:假定选 ...
- UVa 1671 语言的历史——判断两个DFA是否等价
题意 一个DFA可以用一个5元组 $((Q, \sum , \delta , q_0, F))$ 表示,其中 $Q$ 为状态集,$\sum$ 为字母表,$\delta$ 为转移函数,$q_0$ 为起 ...
- 一句话+两张图搞定JDK1.7HashMap,剩下凑字数
JDK1.7 HashMap一探究竟 HashMap很简单,原理一看散列表,实际数组+链表;Hash找索引.索引若为null,while下一个.Hash对对碰,链表依次查.加载因子.75,剩下无脑扩数 ...
随机推荐
- Linux命令之lsb_release - 查看当前系统的发行版信息
用途说明 lsb_release命令用来查看当前系统的发行版信息(prints certain LSB (Linux Standard Base) and Distribution informati ...
- iscsi target 之LIO配置
LIO 配置 现在主流Linux都可以设置iSCSI,如STGT/TGT.LIO Target等.Linux-IO(LIO)Target是当前Linux标准的iSCSI target的开源实现,包含在 ...
- Sketch 使用中文字体
对于刚接触 Sketch 的人来说,在找字体方面,可能不是那么顺手.之前用 RightFont,后来收费了.. 今天介绍个只有长得好看的人才能发现的功能.无需插件即可选择中文字体. 不信,你看: Sk ...
- Facade 设计模式
目的 在一个子系统的一组接口上提供一个统一的接口.Facade 设计模式定义了一个更高级别的接口,使子系统更容易使用. 通过一个更加简洁的接口来包装一个复杂的子系统. 解决的问题 客户端需要一个简化的 ...
- Mac下django简单安装配置步骤
一.安装软件包并创建项目 $sudo pip install django$sudo python -c "import django;print django.VERSION"( ...
- html input控件总结
Input表示Form表单中的一种输入对象,其又随Type类型的不同而分文本输入框,密码输入框,单选/复选框,提交/重置按钮等,下面一一介绍. 1,type=text 输入类型是text,这是我们见的 ...
- Python 爬虫实例(13) 下载 m3u8 格式视频
Python requests 下载 m3u8 格式 视频 最近爬取一个视频网站,遇到 m3u8 格式的视频需要下载. 抓包分析,视频文件是多个 ts 文件,什么是 ts文件,请去百度 ...
- octave画心形曲线
octave是gnu出品和matlab兼容的科学计算软件,具有体积小,兼容性好,免费的优点. 心形曲线是根据函数:( x2 + y2 -1 )3 - x2y3=0 改编而成. clear all; c ...
- 给现有MVC项目增加Web API支持
在MVC4中自带了Web API不再需要从Nuget中下载. Step1:增加System.Web.Http,System.Web.Http.WebHost,System.Net.Http三个程序集的 ...
- 关于android fragment 某些使用记录
1.首先是当android2.3.3之前还是用着android-support-v4.jar来加载Fragment时. a.在xml布局应该如何定义呢? 答案:用FrameLayout标签来定义(在a ...