您的位置:首页 > 其它

HDU 3629 图的同构

2015-06-04 16:52 363 查看
思路:每个顶点不可孤立 ,每个顶点的度不可超过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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: