问题:输入一个结点的无根树的各条边,并指定一个根结点,要求把该树转化为有根树

测试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;
}
 posted on 2015-05-06 09:27  平和之心  阅读(564)  评论(0编辑  收藏  举报