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 ...
随机推荐
- Java之反射代码演示说明
还不存在的类–即我们需要使用反射来使用的类 Person类: package com.qf.demo4; public class Person { private String name; publ ...
- 网页中使用CSS和JS阻止用户选择内容
CSS实现 body{ -webkit-user-select:none; -moz-user-select:none; -ms-user-select:none; user-select:none; ...
- 预约会议sql
CREATE proc sp_MeetingCheck_Test @serialno varchar(max)='', ---- 主档serialno @title ...
- 关于table 冻结 标头及列---js控制方法
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"% ...
- vue动画的用法
vue动画 在vue.js中有两种写动画的方法,第一种就是像js里一样,用原生代码来实现,第二种则是使用animate.css的动画类文件,这个动画类和bootstrap.css文件类似,直接调用类就 ...
- JDBC加载数据库驱动的方式
JDBC作为数据库访问的规范接口,其中只是定义一些接口.具体的实现是由各个数据库厂商来完成. 一.重要的接口: 1.public interface Driver 每个驱动程序类必须实现的接口.Jav ...
- RMAN备份与恢复(一)--认识RMAN
RMAN(Recovery Manager)是Oracle恢复管理器的简称,是集数据库备份(backup).修复(restore)和恢复(recover)于一体的工具.接下来了解一下RMAN中的几个重 ...
- 基于Vue全家桶开发的前端组件管理平台
项目背景 项目背景是外包类建站公司里,设计环节沉淀了大量可复用组件,设计师往往只需要微调组件就拼凑出页面,交付给前端,理论上这些组件在前端也可以复用,但实际上前端每次都要重新实现整个页面,浪费很多人力 ...
- R 包 安装 卸载 查看版本
R 查看包的版本 version> packageVersion("snow") 卸载包remove.packages 从源码安装包install.packages(path ...
- 在centos6.7中lnmp环境下安装swoole插件和pthreads插件
1.首先在安装lnmp集成包之前,解压lnmp1.3-full.tar.gz,进入到lnmp1.3-full/include/目录下; 2.输入 vi php.sh;编辑php.sh文档.博主安的是p ...