图形比较特殊, 每个点的度最大是2, 故图形由链(list)和圆(circle), 其中度为0的点归为链.
由此, 我们可以对每个点进行DFS, 判断这个点所在图形是链还是圆.
然后就可以根据两个图的链的数目是否相等, 链的节点是否相等; 圆的数目是否相等, 圆的节点是否相等.
/******************************************************************************* # Author : Neo Fung # Email : [email protected] # Last modified: 2012-02-05 21:14 # Filename: HDU3926 Hand in Hand.cpp # Description : ******************************************************************************/ #ifdef _MSC_VER #define DEBUG #endif #include <fstream> #include <stdio.h> #include <iostream> #include <string.h> #include <string> #include <limits.h> #include <algorithm> #include <math.h> #include <numeric> #include <functional> #include <ctype.h> #include <vector> #define MAX 10010 using namespace std; bool inline cmp(const vector<int> &lhs,const vector<int> &rhs) { return lhs.size()<rhs.size(); } struct GRAPH { vector<int> adj[MAX],list[MAX],cirle[MAX]; bool used[MAX]; bool visit[MAX]; int n,lcnt,ccnt; void init(const int &t) { n=t; lcnt=ccnt=0; memset(visit,false,sizeof(visit)); memset(used,false,sizeof(used)); for (int i=0;i<MAX;++i) { list[i].clear(); cirle[i].clear(); adj[i].clear(); } } void add_adj(const int &x,const int &y) { used[x]=true; bool flag=true; for(size_t i=0;i<adj[x].size();++i) if(adj[x][i]==y) flag=false; if(flag) adj[x].push_back(y); } bool dfs(const int &u) { visit[u]=true; list[lcnt].push_back(u); cirle[ccnt].push_back(u); bool flag=true; for(size_t j=0;j<adj[u].size();++j) if(!visit[adj[u][j]]) flag=false; if(flag) if(adj[u].size()==1) return false; else return true; bool ans=false; for(size_t j=0;j<adj[u].size();++j) if(!visit[adj[u][j]]) ans = ans||dfs(adj[u][j]); return ans; } void func() { for(int i=0;i<MAX;++i) { if(!visit[i] && used[i]) { bool ans=dfs(i); if(!ans) { cirle[ccnt].clear(); ++lcnt; } else { list[lcnt].clear(); ++ccnt; } } } sort(list,list+lcnt,cmp); sort(cirle,cirle+ccnt,cmp); } }; bool check(const vector<int> *lhs,const int &lcnt,const vector<int> *rhs,const int &rcnt) { if(lcnt!=rcnt) return false; for(int i=0;i<lcnt;++i) if(lhs[i].size()!=rhs[i].size()) return false; return true; } int main(void) { #ifdef DEBUG freopen("../stdin.txt","r",stdin); freopen("../stdout.txt","w",stdout); #endif int ncases,n,m; int a,b; GRAPH lhs,rhs; scanf("%d",&ncases); for(int nc=1;nc<=ncases;++nc) { scanf("%d%d",&n,&m); lhs.init(n); while(m--) { scanf("%d%d",&a,&b); lhs.add_adj(a,b); lhs.add_adj(b,a); } lhs.func(); scanf("%d%d",&n,&m); rhs.init(n); while(m--) { scanf("%d%d",&a,&b); rhs.add_adj(a,b); rhs.add_adj(b,a); } rhs.func(); bool ans=check(lhs.list,lhs.lcnt,rhs.list,rhs.lcnt) && check(lhs.cirle,lhs.ccnt,rhs.cirle,rhs.ccnt); printf("Case #%d: ",nc); if(!ans) printf("NO\n"); else printf("YES\n"); } return 0; }