HDU 3629 图的同构
2015-06-04 16:52
363 查看
思路:每个顶点不可孤立 ,每个顶点的度不可超过2,则相应的图必定是由若干个链或环组成。
如果为链,则必有两顶点度为1 ;如果为环,则每个顶点度均为2 。
那么比较两个图的链和环是否完全按相同即可。
对每个分支记录分支内的顶点个数 和 是否为环,然后对每个分支进行排序,按照顶点个数从小到大,相同顶点个数的,环在前,链在后。最后依次比较即可。
如果为链,则必有两顶点度为1 ;如果为环,则每个顶点度均为2 。
那么比较两个图的链和环是否完全按相同即可。
对每个分支记录分支内的顶点个数 和 是否为环,然后对每个分支进行排序,按照顶点个数从小到大,相同顶点个数的,环在前,链在后。最后依次比较即可。
#include<cstdio> #include<cstring> #include<vector> #include<algorithm> #define CLR(a,b) memset(a,b,sizeof(a)) using namespace std; const int maxn = 1e4 + 5; int n1,m1,n2,m2; struct node{ int num,loop; bool operator < (const node& z){ if(num != z.num) return num < z.num; else return loop < z.loop; } }; node te1[maxn],te2[maxn]; int len1,len2; vector<int> g1[maxn]; vector<int> g2[maxn]; int deg1[maxn],deg2[maxn]; bool vis1[maxn],vis2[maxn]; void init(){ len1 = len2 = 0; for(int i=0;i<maxn;i++){ g1[i].clear();g2[i].clear(); } CLR(vis1,0);CLR(vis2,0); CLR(deg1,0);CLR(deg2,0); } void dfs1(int u,int &cnt,int &loop){ vis1[u] = true; if(deg1[u] == 1) loop++; for(int i=0;i<g1[u].size();i++){ int v = g1[u][i]; if(!vis1[v]){ dfs1(v,++cnt,loop); } } } void dfs2(int u,int &cnt,int &loop){ vis2[u] = true; if(deg2[u] == 1) loop++; for(int i=0;i<g2[u].size();i++){ int v = g2[u][i]; if(!vis2[v]){ dfs2(v,++cnt,loop); } } } bool solve(){ for(int i=1;i<=n1;i++){ if(!vis1[i]){ int cnt = 1,loop = 0; dfs1(i,cnt,loop); te1[len1].num = cnt; te1[len1].loop = loop; len1++; } } for(int i=1;i<=n2;i++){ if(!vis2[i]){ int cnt = 1,loop = 0; dfs2(i,cnt,loop); te2[len2].num = cnt; te2[len2].loop = loop; len2++; } } sort(te1,te1+len1); sort(te2,te2+len2); if(len1 != len2) return false; else{ for(int i=0;i<len1;i++){ if(te1[i].loop != te2[i].loop || te1[i].num != te2[i].num ) return false; } } return true; } int main(){ int cas; scanf("%d",&cas); for(int t=1;t<=cas;t++){ init(); scanf("%d%d",&n1,&m1); int a,b; while(m1--){ scanf("%d%d",&a,&b); g1[a].push_back(b); g1[b].push_back(a); deg1[a]++;deg1[b]++; } scanf("%d%d",&n2,&m2); while(m2--){ scanf("%d%d",&a,&b); g2[a].push_back(b); g2[b].push_back(a); deg2[a]++;deg2[b]++; } bool ans = solve(); if(ans) printf("Case #%d: YES\n",t); else printf("Case #%d: NO\n",t); } }
相关文章推荐
- npm仓库操作
- windows find 文件
- 开源项目网站
- 常用的SAP系统FM
- MVC4 WebAPI(一)
- js作用域
- Aspose.Words基本操作
- awk 高级应用和$NF用法
- [Asp.net 5] Logging-日志系统的基本架构(下)
- 数据类型转换
- sp转dp dp转px
- 今天股市深V,你忍住了吗^_^
- 常用日文计算机词汇
- php页面添加计数器(基于数据库)
- Image Loader -Cube SDK
- maven update project java compiler
- mfc判断组合键和大小写开关
- IOS 冷门知识
- 更新登录SAP后的LOGO
- html5利用websocket完成的推送功能