hdu 3926 hands in hands
https://vjudge.net/problem/HDU-3926
题意:
有n个小朋友,他们之间手拉手,但是一只手只能拉一只手或者不拉,现在给出两个图,表示拉手关系,问这两个图是否同构。
思路:
一开始被同构难住了,后来思考发现,每一个联通分量只能是一条链或者一个简单的环,这样就比较好判断了。利用并查集统计每一个连通分量中的点,然后判断类型,判断类型的时候用度数是否为1来判断是否为链,然后将每一个连通分量先根据大小,再根据类型进行排序,最后把两个图进行一个比较即可。
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <vector>
using namespace std; int fao[],fat[],d[];
vector<int> g[],v[]; struct node
{
int ty,sz;
}; node disc1[],disc2[]; void init1(int n)
{
for (int i = ;i <= n;i++)
{
fao[i] = i;
}
} void init2(int n)
{
for (int i = ;i <= n;i++)
fat[i] = i;
} int fin1(int x)
{
if (x == fao[x]) return x;
else return fao[x] = fin1(fao[x]);
} int fin2(int x)
{
if (x == fat[x]) return x;
else return fat[x] = fin2(fat[x]);
} void unit1(int x,int y)
{
x = fin1(x);
y = fin1(y); if (x != y) fao[x] = y;
} void unit2(int x,int y)
{
x = fin2(x);
y = fin2(y); if (x != y) fat[x] = y;
} int dfs1(int n)
{
for (int i = ;i < g[n].size();i++)
{
int t = g[n][i]; if (d[t] == ) return ;
} return ;
} int dfs2(int n)
{
for (int i = ;i < v[n].size();i++)
{
int t = v[n][i]; if (d[t] == ) return ;
} return ;
} bool cmp(node aa,node bb)
{
if (aa.sz == bb.sz)
return aa.ty < bb.ty;
return aa.sz < bb.sz;
} int main()
{
int t; scanf("%d",&t); int cas = ; while(t--)
{
memset(v,,sizeof(v));
memset(g,,sizeof(g));
memset(disc1,,sizeof(disc1));
memset(disc2,,sizeof(disc2));
memset(d,,sizeof(d)); int n,m; scanf("%d%d",&n,&m); init1(n); for (int i = ;i < m;i++)
{
int x,y; scanf("%d%d",&x,&y); d[x]++;
d[y]++; unit1(x,y);
} for (int i = ;i <= n;i++)
{
g[fin1(i)].push_back(i);
} int cnt1 = ; for (int i = ;i <= n;i++)
{
if (g[i].size() != )
{
disc1[cnt1].sz = g[i].size();
disc1[cnt1].ty = dfs1(i);
cnt1++;
}
} scanf("%d%d",&n,&m); init2(n); int cnt2 = ; memset(d,,sizeof(d)); for (int i = ;i < m;i++)
{
int x,y; scanf("%d%d",&x,&y); d[x]++;d[y]++; unit2(x,y);
} for (int i = ;i <= n;i++)
v[fin2(i)].push_back(i); for (int i = ;i <= n;i++)
{
if (v[i].size() != )
{
disc2[cnt2].sz = v[i].size();
disc2[cnt2].ty = dfs2(i);
cnt2++;
}
} sort(disc1,disc1 + cnt1,cmp);
sort(disc2,disc2 + cnt2,cmp); bool ff = ; if (cnt1 != cnt2) ff = ; for (int i = ;i < cnt1;i++)
{
if (disc1[i].sz != disc2[i].sz) ff = ;
if (disc1[i].ty != disc2[i].ty) ff = ;
} if (ff) printf("Case #%d: NO\n",++cas);
else printf("Case #%d: YES\n",++cas);
} return ;
}
hdu 3926 hands in hands的更多相关文章
- HDU 3926 并查集 图同构简单判断 STL
给出两个图,问你是不是同构的... 直接通过并查集建图,暴力用SET判断下子节点个数就行了. /** @Date : 2017-09-22 16:13:42 * @FileName: HDU 3926 ...
- HDU 3926 图的同构
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3926 题意:给定2个顶点度最大为2的无向图.问你这2个无向图是否同构. 思路: 1.最大度为2.说明这 ...
- hdu 3926 Hand in Hand 同构图
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3926 In order to get rid of Conan, Kaitou KID disguis ...
- hdu 3926 Hand in Hand
http://acm.hdu.edu.cn/showproblem.php?pid=3926 这道题是判断两个图是不是同构相似.只要判断图中环的个数和链的个数,和每个环的节点数和链的节点数是否相等. ...
- 【转载】图论 500题——主要为hdu/poj/zoj
转自——http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并 ...
- hdu图论题目分类
=============================以下是最小生成树+并查集====================================== [HDU] 1213 How Many ...
- HDU图论题单
=============================以下是最小生成树+并查集====================================== [HDU] 1213 How Many ...
- HDOJ 2111. Saving HDU 贪心 结构体排序
Saving HDU Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- 【HDU 3037】Saving Beans Lucas定理模板
http://acm.hdu.edu.cn/showproblem.php?pid=3037 Lucas定理模板. 现在才写,noip滚粗前兆QAQ #include<cstdio> #i ...
随机推荐
- gulp+browserSync自动刷新页面
BrowserSync “Browsersync能让浏览器实时.快速响应您的文件更改(html.js.css.sass.less等)并自动刷新页面.更重要的是 Browsersync可以同时在PC.平 ...
- sql还原(.bak文件还原)
第一步: 右键“数据库”,选择“还原数据库” 第二步: 选择“设备”,然后选择“…” 第三步: 添加备份文件(这里使用MyDB.bak) 第四步: 勾选“还原”复选框,进度显示“已完成” 第五步: 最 ...
- characterEncodingFilter作用
package com.demo.test; import java.io.IOException; import javax.servlet.Filter; import javax.servlet ...
- C#开发移动应用系列(1.环境搭建)
前言 是时候蹭一波热度了..咳咳..我什么都没说.. 其实也是有感而发,昨天看到Jesse写的博文(是时候开始用C#快速开发移动应用了),才幡然醒悟 , 原来我们的Xamarin已经如此的成熟了... ...
- Promise实现多图预加载
Promise正如它的中文意思“承诺”一样,保存着未来会发生事件(一般为异步操作).Promise避免了“回调地狱”,写法更加接近同步操作.说到同步,我更加喜欢async.await,它们书写更贴近同 ...
- Iterator invalidation(迭代器失效)
一.vector 所有读操作.swap.std::swap:都不会引起迭代器失效... clear.operator=.assign:都会引起全部变量迭代器失效 reserve.shrink_to_f ...
- mac Path had bad ownership/permissions
解决方案: http://stackoverflow.com/questions/28063598/error-while-executing-plist-file-path-had-bad-owne ...
- html5中cookie介绍,封装以及添加,获取,删除
cookie是储存在用户本地终端上的数据. 在我们登陆网站时有记录密码,也有时间限制比如说7天,5天等等这都是我们利用cookie来写的, 这就是利用了cookie的会话周期,但cookie同时又是不 ...
- PHP面向对象笔记解析
PHP的面向对象是很重要的内容,也是很常用的内容.所以现在就把PHP面向对象进行整理了一下. 顺带,我会在后面把我整理的一整套CSS3,PHP,MYSQL的开发的笔记打包放到百度云,有需要可以直接去百 ...
- window对象screen、history
Window 对象属性 http://www.runoob.com/jsref/obj-window.html