hdu -3926-简单判同构并查集
2016-07-12 14:08
477 查看
http://acm.hdu.edu.cn/showproblem.php?pid=3926
简要判断图的同构,由于点度数不超过2
只可能形成环、链、点,
因此用并查集合并与记录
判断 是否为环,就看加入的边,时候之前已经联通,如果是,则说明存在环
最后判断同构的时候,只需要取每个联通分量的 根节点信息比较【节点数,环还是链...】
...这个做法是错的。。。数据太弱了。。怎么做都a
网上的判环的代码一般是 直接 合并的时候 fx==fy就判定为环,这个是有问题的,如果遇到含有重边的链,会误判为环
...应该先去重边,直接把一个联通块里的每个点的度数看看是否全为2,全为2则为环,否则必为链。
附上两组数据:
2
---
8 7
1 2
2 3
4 5
5 6
6 7
7 8
3 4
8 7
1 2
2 3
3 4
4 5
5 6
6 7
7 8
------
3 3
1 2
2 3
1 2
3 3
1 2
2 3
3 1
简要判断图的同构,由于点度数不超过2
只可能形成环、链、点,
因此用并查集合并与记录
判断 是否为环,就看加入的边,时候之前已经联通,如果是,则说明存在环
最后判断同构的时候,只需要取每个联通分量的 根节点信息比较【节点数,环还是链...】
...这个做法是错的。。。数据太弱了。。怎么做都a
网上的判环的代码一般是 直接 合并的时候 fx==fy就判定为环,这个是有问题的,如果遇到含有重边的链,会误判为环
...应该先去重边,直接把一个联通块里的每个点的度数看看是否全为2,全为2则为环,否则必为链。
附上两组数据:
2
---
8 7
1 2
2 3
4 5
5 6
6 7
7 8
3 4
8 7
1 2
2 3
3 4
4 5
5 6
6 7
7 8
------
3 3
1 2
2 3
1 2
3 3
1 2
2 3
3 1
#include <cstdio> #include <cmath> #include <cstring> #include <string> #include <algorithm> #include <queue> #include <map> #include <set> #include <vector> #include <iostream> using namespace std; const double pi=acos(-1.0); double eps=0.000001; int fa[11234]; int find(int x) { if (fa[x]==x) return x; else return fa[x]=find(fa[x]); } struct node { int kind,num; node() {} node(int a,int b) { kind=a,num=b; } bool operator<(const node &b)const { if (kind!=b.kind) return kind<b.kind; else return num<b.num; } }; int ring[12345]; vector <int> que[12345]; int num[12345]; node n1[12345]; node n2[12345]; int du[12345]; map <int ,map<int ,int > > mp; void getSlove(int &n,int &m,int &cnt1,node n1[]) { mp.clear(); memset(du,0,sizeof du); scanf("%d%d",&n,&m); for (int i=1; i<=n; i++) fa[i]=i; for(int i=1; i<=m; i++) { int a,b; scanf("%d%d",&a,&b); if (a>b) swap(a,b); if (mp[a][b]==1) continue; mp[a][b]=1; int fx=find(a); int fy=find(b); du[a]++,du[b]++; if (fx!=fy) fa[fx]=fy; } set<int> sb1; sb1.clear(); memset(num,0,sizeof num); for (int i=1; i<=n; i++) que[i].clear(),ring[i]=1; for (int i=1; i<=n; i++) { int ff=find(i); que[ff].push_back(i); num[ff]++; if (du[i]!=2) ring[ff]=0; sb1.insert(ff); } set<int >::iterator it; cnt1=0; for (it=sb1.begin(); it!=sb1.end(); it++) { int x=*it; n1[++cnt1]=node(ring[x],que[x].size()); } } int main() { int t; cin>>t; int cun=1; while(t--) { int cnt1=0; int nn1,mm1; getSlove(nn1,mm1,cnt1,n1); int cnt2=0; int nn2,mm2; getSlove(nn2,mm2,cnt2,n2); printf("Case #%d: ",cun++); sort(n1+1,n1+1+cnt1); sort(n2+1,n2+1+cnt2); int flag=0; for (int i=1; i<=cnt1; i++) { if (!(n1[i].kind==n2[i].kind&&n1[i].num==n2[i].num)) { flag=1; break; } } if (!flag) printf("YES\n"); else printf("NO\n"); } return 0; }
相关文章推荐
- 淘宝顶端的通知样式 .
- css--伪类:first-child
- html5常用js简介之二
- Android Studio 之aar
- 远程桌面卡
- 修改Reachability检测2g、3g、4g网络
- Android Studio出现:Your project path contains non-ASCII characters.....
- eclipse package,source folder,folder区别及相互转换
- 第6章 Linux的档案管理与目录配置
- HDOJ 1004 Let the Balloon Rise
- 学习java多线程的线程池
- Android Activity生命周期
- 『MySQL』索引类型 normal, unique, full text
- ansible 配置运行环境
- 手把手教你做三级联动
- TMS320F28335之系统时钟
- SSH服务
- 手把手教你做三级联动
- 射线和平面的相交性检测
- 【TJOI & HEOI 2016】【BZOJ 4554】【JZOJ 4612】 游戏