標籤: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 0x7fffffffusing 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 0x7fffffffusing 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;}
資料結構 - 樹(基礎)