ZOJ 3602 Count the Trees
2014-04-04 16:46
330 查看
题意:
有两棵树 问 一共有几棵同构的子树
思路:
树的同构问题用最小表示法解决 byvoid的hash方法是把树hash成字符串 不过本题我用这个方法一直SF不懂为啥…
这题有一点方便之处就是 二叉树! 一次可以用 pair<leftchild,rightchild>来表示一个节点 并把pair利用map哈希成一个int值 就可以保证每个节点都是一个pair了
在hash的同时利用数组计数 就可以计算ans
代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
#include<set>
#include<vector>
#include<string>
#include<iostream>
using namespace std;
#define M 100010
int T,n,m;
int l[M],r[M];
long long ans;
long long num[M*2];
map<pair<int,int>,int> mp;
map<pair<int,int>,int>::iterator it;
int dfs(int u,int id)
{
pair<int,int> me;
if(l[u]!=-1) me.first=dfs(l[u],id);
else me.first=-1;
if(r[u]!=-1) me.second=dfs(r[u],id);
else me.second=-1;
if(!mp[me]) mp[me]=mp.size()+1;
int f=mp[me];
if(id) ans+=num[f];
else num[f]++;
return f;
}
int main()
{
int i;
scanf("%d",&T);
while(T--)
{
memset(num,0,sizeof(num));
ans=0;
mp.clear();
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++) scanf("%d%d",&l[i],&r[i]);
dfs(1,0);
for(i=1;i<=m;i++) scanf("%d%d",&l[i],&r[i]);
dfs(1,1);
printf("%lld\n",ans);
}
return 0;
}
有两棵树 问 一共有几棵同构的子树
思路:
树的同构问题用最小表示法解决 byvoid的hash方法是把树hash成字符串 不过本题我用这个方法一直SF不懂为啥…
这题有一点方便之处就是 二叉树! 一次可以用 pair<leftchild,rightchild>来表示一个节点 并把pair利用map哈希成一个int值 就可以保证每个节点都是一个pair了
在hash的同时利用数组计数 就可以计算ans
代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
#include<set>
#include<vector>
#include<string>
#include<iostream>
using namespace std;
#define M 100010
int T,n,m;
int l[M],r[M];
long long ans;
long long num[M*2];
map<pair<int,int>,int> mp;
map<pair<int,int>,int>::iterator it;
int dfs(int u,int id)
{
pair<int,int> me;
if(l[u]!=-1) me.first=dfs(l[u],id);
else me.first=-1;
if(r[u]!=-1) me.second=dfs(r[u],id);
else me.second=-1;
if(!mp[me]) mp[me]=mp.size()+1;
int f=mp[me];
if(id) ans+=num[f];
else num[f]++;
return f;
}
int main()
{
int i;
scanf("%d",&T);
while(T--)
{
memset(num,0,sizeof(num));
ans=0;
mp.clear();
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++) scanf("%d%d",&l[i],&r[i]);
dfs(1,0);
for(i=1;i<=m;i++) scanf("%d%d",&l[i],&r[i]);
dfs(1,1);
printf("%lld\n",ans);
}
return 0;
}
相关文章推荐
- ZOJ 3602 Count the Trees
- zoj 3602 Count the Trees (dfs+哈希)
- ZOJ 3602 Count the Trees 树的同构 (哈希)
- zoj 3602 Count the Trees 二叉树HASH 浙江省第9届大学生程序设计竞赛 第三题
- ZOJ 3602 Count the Trees
- zoj 3602 Count the Trees 树的同构
- zoj 3602 Count the Trees
- ZOJ 3602 Count the Trees(二叉树)
- zoj 3602 Count the Trees(二叉树性质)
- ZOJ 3602 Count the Trees
- zjuoj 3602 Count the Trees
- zoj 1453 Surround the Trees
- ZOJ 1610 Count the Colors 线段树区间修改
- zoj 1610 Count the Colors(线段树)
- ZOJ 1610 Count the Colors(线段树——区间更新)(成段染色)
- zoj 1610 Count the Colors(线段树)(成段更新染色)
- ZOJ 1610 Count the Colors 线段树 成段更新 单点求值
- HDOJ HDU 1131 Count the Trees
- zoj 1610 Count the Colors 【区间覆盖 求染色段】
- ZOJ 1610 Count the Colors 线段树 染色问题