hdu 3926 Hand in Hand

来源:互联网 发布:微信淘宝客是真的吗 编辑:程序博客网 时间:2024/04/29 12:06

判断两个图是否是同构的。

根据题意,这个图只能由环和链组成。判断环的个数以及每个环组成的人数,还有链的个数以及每个链组成的人数 是否相等即可。

#include <queue>#include <stack>#include <math.h>#include <stdio.h>#include <stdlib.h>#include <iostream>#include <limits.h>#include <string.h>#include <string>#include <algorithm>#define MID(x,y) ( ( x + y ) >> 1 )#define L(x) ( x << 1 )#define R(x) ( x << 1 | 1 )#define BUG puts("here!!!")using namespace std;const int MAX = 40010;struct NODE{ int to; NODE *next;};NODE node[MAX];NODE *p[MAX];int cnt;int d[MAX];bool used[MAX];void init(){memset(d,0,sizeof(d));memset(used,0,sizeof(used));memset(node,0,sizeof(node));memset(p,0,sizeof(p));cnt  = 0;}void Add(int u,int v,int &cnt){node[cnt].to = v;node[cnt].next = p[u];p[u] = &node[cnt++];}bool DFS(int t,int &cnt){NODE *head = p[t];while( head != NULL ){if( used[head->to] ){head = head->next;continue;}used[head->to] = true;cnt++;DFS( head->to ,cnt);head = head->next;}return false;}void solve(int n,int &huan,int *h,int &tree,int *t){int cnt = 0;queue<int> q;for(int i=1; i<=n; i++)if( d[i] == 1 )q.push(i); while( !q.empty() ){int i = q.front(); q.pop();if(!used[i]){used[i] = true;cnt = 1;DFS(i,cnt);t[tree++] = cnt;}}for(int i=1; i<=n; i++){cnt = 1;if( !used[i] ){used[i] = true;DFS(i,cnt);h[huan++] = cnt;}}}bool check(int *a,int s1,int *b,int s2){if( s1 != s2 ) return false;for(int i=0; i<s1; i++)if( a[i] != b[i] ) return false;return true;}int main(){int ncases,ind = 1,n,m,x,y;int h2,t2;scanf("%d",&ncases);int tt1[MAX],tt2[MAX];int hh1[MAX],hh2[MAX];while( ncases-- ){init();scanf("%d%d",&n,&m);while( m-- ){scanf("%d%d",&x,&y);d[x]++; d[y]++;Add(x,y,cnt);Add(y,x,cnt);}int h1,t1;h1 = t1 = h2 = t2 = 0;solve(n,h1,hh1,t1,tt1);init();scanf("%d%d",&n,&m);while( m-- ){scanf("%d%d",&x,&y);d[x]++; d[y]++;Add(x,y,cnt);Add(y,x,cnt);}solve(n,h2,hh2,t2,tt2);sort(hh1,hh1+h1);sort(hh2,hh2+h2);sort(tt1,tt1+t1);sort(tt2,tt2+t2);printf("Case #%d: ",ind++);if( check(tt1,t1,tt2,t2) && check(hh1,h1,hh2,h2) )printf("YES\n");elseprintf("NO\n");}return 0;}