标签:
问题:输入一个结点的无根树的各条边,并指定一个根结点,要求把该树转化为有根树
测试oj:nyoj http://acm.nyist.net/JudgeOnline/problem.php?pid=20
当结点数很多时若用邻接矩阵存储图将占用很大的空间,此时可使用vector或邻接表存储,由于vector内存的增长方式问题也可能会引起内存过大问题,此时邻接表存储更具优势
代码:
使用vector存储:
#include<iostream> #include<cstdio> #include<vector> #include<cstring> using namespace std; const int N = 100005; int p[N]; vector<int> g[N]; void build(int u, int fa) { int n = g[u].size(); for(int i=0; i<n; i++){ int v = g[u][i]; if(v == fa) continue; p[v] = u; build(v, u); } } int main() { int n, t, start; scanf("%d", &t); while(t--) { for(int i=0; i<N; i++) g[i].clear(); scanf("%d%d", &n, &start); int a, b; for(int i=0; i<n-1; i++){ scanf("%d%d", &a, &b); g[a].push_back(b); g[b].push_back(a); } p[start] = -1; build(start, -1); if(n >= 1) printf("%d", p[1]); for(int i=2; i<=n; i++) printf(" %d", p[i]); printf("\n"); } return 0; }
使用邻接链表存储:
#include <iostream> #include <cstdio> #include <cstring> #include <stack> #include <map> using namespace std; #define N 100005 int n; int p[N]; int head[N]; int len; struct Node { int data; int next; }c[2*N];//对于不指明父子关系的结点(无向图)需要2倍的空间 void insert(int a, int b) { c[++len].data = b; c[len].next = head[a]; head[a] = len; } void build(int u, int fa) { for(int i=head[u]; i; i=c[i].next) { int v = c[i].data; if(v == fa) continue; p[v] = u; build(v, u); } } void print() { if(n>=1) printf("%d", p[1]); for(int i=2; i<=n; i++) printf(" %d", p[i]); printf("\n"); } void init() { len = 0; memset(head, 0, sizeof(head)); memset(c, 0, sizeof(c)); memset(p, 0, sizeof(p)); } int main() { int t, start; scanf("%d", &t); while(t--) { scanf("%d%d", &n, &start); init(); int a, b; for(int i=1; i<n; i++) { scanf("%d%d", &a, &b); insert(a, b); insert(b, a); } p[start] = -1; build(start, -1); print(); } return 0; }
标签:
原文地址:http://www.cnblogs.com/vegg117/p/4480950.html