Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

哈哈没看discuss,同写了个哈希,47ms1A

Posted by KatrineYang at 2016-09-21 12:17:09 on Problem 1343
#include <iostream>
#include <stdio.h>
#include <vector>
using namespace std;

const int HASH = 2333;

int k,n;
struct tree{
	int size;
	int sucNo;
	vector<tree*> sucs;
	int depth;
	int hashVal;
	void getSucNo(){
		sucNo = sucs.size();
		for(int i = 0; i < sucNo; i++){
			sucs[i]->getSucNo();
		}
	}
	void getSize(){
		size = 0;
		for(int i = 0; i < sucNo; i++){
			sucs[i]->getSize();
			size += sucs[i]->size;
		}
		size += 1;
	}
	void getDepth(){
		if(!sucNo) {
			depth = 0;
			return;
		}
		depth = 0;
		for(int i = 0; i < sucNo; i++){
			sucs[i]->getDepth();
			if(depth < sucs[i]->depth) depth = sucs[i]->depth;
		}
		depth++;
	}
	void getHashVal(){
		hashVal = 0;
		for(int i = 0; i < sucNo; i++){
			sucs[i]->getHashVal();
			hashVal += sucs[i]->hashVal;
		}
		hashVal += size*size + depth*depth + sucNo*sucNo;
		hashVal %= HASH;
	}
}trees[200];

int idx[200];
int wz[200];
vector<int> hashtable[HASH];

void buildTree(int adjNo[110], int adjList[110][110], tree *tr, int rootIdx){
	if(!adjNo[rootIdx]) return;
	for(int i = 0; i < adjNo[rootIdx]; i++){
		tree *temp = new tree;
		tr->sucs.push_back(temp);
		buildTree(adjNo, adjList, temp, adjList[rootIdx][i]);
	}
}

bool isIsomph(tree *t1, tree *t2){
	if(t1->hashVal != t2->hashVal || t1->size != t2->size || t1->depth != t2->depth || t1->sucNo != t2->sucNo){
		return 0;
	}
	bool visited[150] = {0};
	for(int i = 0; i < t1->sucNo; i++){
		int offset = 0;
		for(; offset < t1->sucNo; offset++){
			if(!visited[offset] && isIsomph(t1->sucs[i], t2->sucs[offset])) {
				visited[offset] = 1;
				break;
			}
		}
		if(offset == t1->sucNo) return 0;
	}
	return 1;
}

int main() {
	scanf("%d%d", &k, &n);
	if(n == 1){
		for(int i = 1; i <= k; i++){
			printf("%d ", i);
			if(i != k) printf("= ");
		}
		printf(";\n");
		return 0;
	}
	for(int i = 1; i <= k; i++){
		int adjNo[110] = {0};
		int adjList[110][110];
		bool bei[110] = {0};
		for(int j = 0; j < n-1; j++){
			int a, b;
			scanf("%d%d", &a, &b);
			adjList[a][adjNo[a]] = b;
			adjNo[a]++;
			bei[b] = 1;
		}
		int root = 1;
		for(; root <= n && bei[root]; root++);
		//cout << root << endl;
		buildTree(adjNo, adjList, &trees[i], root);
		trees[i].getSucNo();
		trees[i].getSize();
		trees[i].getDepth();
		trees[i].getHashVal();
		idx[i] = trees[i].hashVal;
		wz[i] = hashtable[idx[i]].size();
		hashtable[idx[i]].push_back(i);
	}
	bool visited[200] = {0};
	for(int i = 1; i <= k; i++){
		if(visited[i]) continue;
		printf("%d ", i);
		visited[i] = 1;
		int sz = hashtable[idx[i]].size();
		for(int j = wz[i]+1; j < sz; j++){
			int d = hashtable[idx[i]][j];
			if(visited[d]) continue;
			if(isIsomph(&trees[i], &trees[d])){
				visited[d] = 1;
				printf("= %d ", d);
			}
		}
		printf(";\n");
	}
	return 0;
}

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator