比赛 20160414 评测结果 AAAAWAWAAAWAWAAAAAAA
题目名称 树木园 最终得分 80
用户昵称 农场主 运行时间 7.942 s
代码语言 C++ 内存使用 4.89 MiB
提交时间 2016-04-14 18:04:29
显示代码纯文本
#include<cstdio>
#include<vector>
#include<cstring>
#define mod 100000
using namespace std;
vector<int> G1[100100],G2[100100];
int n,m,u,v,p1[200100]={0},p2[200100]={0},i,q1[100100]={0},q2[100100]={0};
void dfs(int x){
	if (x<0) return;
	memset(q1,0,sizeof(q1));
	memset(q2,0,sizeof(q2));
	for (int i=1;i<=n;i++) {
		for (int j=0;j<G1[j].size();j++){
			q1[i]=(q1[i]+G1[G2[i][j]].size())%mod;
		}
	}
	for (int i=1;i<=n;i++) {
		for (int j=0;j<G2[j].size();j++){
			q2[i]=(q2[i]+G2[G2[i][j]].size())%mod;
		}
	}
	memset(p1,0,sizeof(p1));
	memset(p2,0,sizeof(p2));
	for (int i=1;i<=n;i++){
		p1[q1[i]]++;
		p2[q2[i]]++;
	}
	bool ans=1;
	for (int i=0;i<=mod;i++){
		if (p1[i]!=p2[i]) {
			ans=0;
			return;
		}
	}
	dfs(x-1);
}
int main(){
	freopen("cactus.in","r",stdin);
	freopen("cactus.out","w",stdout);
	scanf("%d%d",&n,&m);
	for (int i=1;i<=m;i++){
		scanf("%d%d",&u,&v);
		G1[u].push_back(v);
		G1[v].push_back(u);
	}
	for (int i=1;i<=m;i++){
		scanf("%d%d",&u,&v);
		G2[u].push_back(v);
		G2[v].push_back(u);
	}
	for (int i=1;i<=n;i++){
		p1[G1[i].size()]=(p1[G1[i].size()]+1)%mod;
		p2[G2[i].size()]=(p2[G2[i].size()]+1)%mod;
	}
	bool ans=1;
	for (int i=0;i<=mod;i++){
		if (p1[i]!=p2[i]) {
			ans=0;
			break;
		}
	}
	dfs(400);
	if (ans==1) printf("YES");
	else printf("NO");
	return 0;
}