码迷,mamicode.com
首页 > 其他好文 > 详细

数据结构 - 树(基础)

时间:2015-04-15 09:44:26      阅读:156      评论:0      收藏:0      [点我收藏+]

标签:acm   数据结构   


1、无根树转有根树

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define LL long long
#define INF 0x7fffffff
#include <vector>
using namespace std;

const int maxn = 1000005;
int p[maxn];
int n;
int root;

vector<int> G[maxn];
void read_tree() {	//输入整棵树 
	int u, v;
	scanf("%d", &n);
	for(int i = 0; i < n - 1; i++) {
		scanf("%d %d", &u, &v);
		G[u].push_back(v);
		G[v].push_back(u);
	}
}

void dfs(int u, int fa) {	//递归转化以u为根的子树,u的父亲为fa 
	int d = G[u].size();
	for(int i = 0; i < d; i++) {	//结点u的相邻点个数 
		int v = G[u][i];			//结点u的第i个相邻点v 
		if(v != fa) dfs(v, p[v] = u);	 //把v的父亲设为u,然后递归转化以v为根的子树 
	}
}

int main() {
	//freopen("in.txt", "r", stdin);
	read_tree();
	
	scanf("%d", &root);
	p[root] = -1;
	
	dfs(root, -1);
	
	for(int i = 0; i < n; i++) {
		printf("%d ", p[i]);
	}
	return 0;
}



2、表达式树

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define LL long long
#define INF 0x7fffffff
using namespace std;

char str[10005]; 

const int maxn = 1000;
int lch[maxn], rch[maxn];	//每个结点的左右儿子编号和字符 
char op[maxn];
int nc;		//结点数 

int build_tree(char * s, int x, int y) {
	int i, c1 = -1, c2 = -1, p = 0;
	int u;
	if(y - x == 1) {	//仅一个字符,建立单独结点 
		u = ++nc;
		lch[u] = rch[u] = 0;
		op[u] = s[x];
		return u;
	} 
	for(int i = x; i < y; i++) {
		switch(s[i]) {
			case '(': p++; break;
			case ')': p--; break;
			case '+': case '-': if(!p) c1 = i; break;
			case '*': case '/': if(!p) c2 = i; break;
		}
	}
	
	if(c1 < 0) c1 = c2;
	if(c2 < 0) return build_tree(s, x + 1, y - 1);
	u = ++nc;
	lch[u] = build_tree(s, x, c1);
	rch[u] = build_tree(s, c1 + 1, y);
	op[u] = s[c1];
	return u;
}

int main() {
	while(scanf("%s", str) != EOF) {
		nc = 0;
		int len = strlen(str);
		op[0] = build_tree(str, 0, len);
		for(int i = 1; i <= nc; i++) {
			printf("%c ", op[i]);
		}
	}
	return 0;
}




3、最小生成树(MST,kruskal)

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define LL long long
#define INF 0x7fffffff
using namespace std;

struct edge {
	int a, b, w;	
}e[10005];

int pa[1000005];
int n, m;

int cmp(edge a, edge b) {	//间接排序函数 
	return a.w < b.w;
}

int find(int x) {	//并查集查找 
	return x == pa[x] ? x : pa[x] = find(pa[x]);
}

int join(edge e) {		//并查集联合 
	int x = find(e.a), y = find(e.b);
	if(x != y) {
		pa[x] = y;
		return e.w;
	}
	return 0;
}

int kruskal() {		//kruskal算法求MST 
	int ans = 0;
	for(int i = 0; i < n; i++) pa[i] = i;//初始化并查集 
	sort(e, e + m, cmp);//给边排序 
	for(int i = 0; i < n; i++) ans += join(e[i]);
	return ans;
}

int main() {
	while(scanf("%d %d", &n, &m) != EOF) {	//n个点,m条边 
		for(int i = 0; i < m; i++) {
			scanf("%d %d %d", &e[i].a, &e[i].b, &e[i].w);
		} 
		printf("%d\n", kruskal());
	}
	return 0;
}













数据结构 - 树(基础)

标签:acm   数据结构   

原文地址:http://blog.csdn.net/u014355480/article/details/45049379

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!