#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;
}
#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;
}
#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;
}
原文:http://blog.csdn.net/u014355480/article/details/45049379