poj 1635 Subway tree systems (树同构)
2017-06-01 07:19
351 查看
题目描述
传送门
题解
树同构问题。昨天考试的时候用到了有根树(儿子有顺序)的同构判断。
我的想法是dfs得到树的dfs序,然后将dfs序中的每个位置替换成这个位置的点的儿子数,然后对数列进行hash。这样其实就转换是序列的hash.
但是这道题儿子是没有顺序的,所以如果只是用上面的方式肯定不行。对于每个节点,现将所有儿子的hash进行排序,然后得到的序列再进行hash。一层一层的向上算,最终得到一个hash值。后来查了一下,这种做法貌似与最小表示法比较类似。
代码
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #include<vector> #define N 3003 #define ULL unsigned long long #define p 2000001001 using namespace std; int tot,nxt ,point ,v ; ULL mi ,ans ; int n,m,T,st ,top,fa ,cnt ,belong ; char ch ; void add(int x,int y) { tot++; nxt[tot]=point[x]; point[x]=tot; v[tot]=y; // cout<<x<<" "<<y<<endl; } void dfs(int x) { cnt[x]=1; vector<ULL> tmp; int k=0; tmp.clear(); for (int i=point[x];i;i=nxt[i]) { dfs(v[i]); cnt[x]++; tmp.push_back(ans[v[i]]); } sort(tmp.begin(),tmp.end()); ans[x]=0; k=tmp.size(); for (int i=0;i<tmp.size();i++) ans[x]+=mi[i+1]*tmp[i]; if (!k) ans[x]=cnt[x]; } ULL solve() { memset(point,0,sizeof(point)); tot=0; n=1; memset(cnt,0,sizeof(cnt)); scanf("%s",ch+1); int len=strlen(ch+1); int t=1; for (int i=1;i<=len;i++) if (ch[i]=='0') { ++n; fa =t; add(t,n); t=n; }else t=fa[t]; top=0; dfs(1); return ans[1]; } int main() { freopen("a.in","r",stdin); // freopen("my.out","w",stdout); scanf("%d",&T); mi[0]=1; for (int i=1;i<=3000;i++) mi[i]=mi[i-1]*p; while (T--) { if (solve()==solve()) printf("same\n"); else printf("different\n"); } }
相关文章推荐
- poj 1635 Subway tree systems 判断树的同构 树的最大最小表示法模板
- POJ 1635 Subway tree systems (树的同构)
- POJ 1635 Subway tree systems(HASH+判断两棵有根树是否同构)
- poj-1635 Subway tree systems(判断两个有根树是否同构)-哈希法
- poj 1635 Subway tree systems(树的同构,经典)
- POJ 1635 Subway tree systems(树同构)
- poj-1635 Subway tree systems(推断两个有根树是否同构)-哈希法
- poj 1635 Subway tree systems
- Poj 1635 Subway tree systems (树的最小表示)
- [有向树的最小表示] poj 1635 Subway tree systems
- POJ 1635 Subway tree systems
- POJ 1635 Subway tree systems
- poj 1635 Subway tree systems
- POJ 1635 Subway tree systems
- Subway tree systems - POJ 1635 树的最小表示法
- POJ 1635 Subway tree systems
- POJ 1635 Subway tree systems (BSOJ 1092)
- POJ 1635 Subway tree systems
- poj 1635 Subway tree systems 判断是否是同构树
- POJ 1635 Subway tree systems