ZOJ3602 Count the Trees STL 트리 구성

1433 단어
제목: 두 그루의 두 갈래 나무 중 같은 구조의 자수를 구해라.
방법: 우선 두 갈래 나무라는 나무를 투철하게!!그리고 섣불리hash, 두 갈래의 독특한 성질로 이 문제를 맵으로 잘 해결할 수 있게 하지 마세요. 기억하세요!!
마지막으로, 가장 중요한 것은 ZOJ에서%lld만 인식할 수 있다는 것이다
#include<utility>
#include<cstdio>
#include<map>
#define LMT 100005
#define LL long long
// 
// 
//map 
using namespace std;
pair<int,int>node1[LMT],node2[LMT];
map< pair<int,int>,int>mp;
map<int,int>mg;
int cnt;
int h1[LMT],h2[LMT];
int gethash(pair<int,int> x)
{
    if(mp.find(x)!=mp.end())return mp[x];
    else
    {
        mp[x]=cnt;
        cnt+=3;
        return cnt-3;
    }
}
void dfs(int u,pair<int,int> *node,int *h)
{
    int l=node[u].first,r=node[u].second;
    if(l>0)dfs(l,node,h);
    else h[l]=-1;
    if(r>0)dfs(r,node,h);
    else h[r]=-1;
    h[u]=gethash(make_pair(h[l],h[r]));
}
int main()
{
	int T,n,m;
	LL ans;
	scanf("%d",&T);
	while(T--)
	{
		int u,v;mp.clear();
		scanf("%d%d",&n,&m);
		cnt=0;
		for(int i=1;i<=n;i++)
		{
			scanf("%d%d",&u,&v);
			node1[i]=make_pair(u,v);
		}
		dfs(1,node1,h1);
		for(int i=1;i<=m;i++)
		{
			scanf("%d%d",&u,&v);
			node2[i]=make_pair(u,v);
		}
		dfs(1,node2,h2);
		mg.clear();
		for(int i=1;i<=m;i++)
		mg[h2[i]]++;
		ans=0;
		for(int i=1;i<=n;i++)
		ans+=(LL)mg[h1[i]];
		printf("%lld
",ans); } return 0; }

좋은 웹페이지 즐겨찾기