poj2021

bfs

View Code
#include <iostream>

#include <cstdio>

#include <cstdlib>

#include <cstring>

#include <algorithm>

using namespace std;



#define maxl 50

#define maxn 105



struct Elem

{

    int age;

    char name[maxl];

}decendant[maxn];



struct Edge

{

    int v, next, w;

}edge[maxn];



int n;

int head[maxn];

int ncount;

int dcount;

int q[maxn];

int ca;



bool operator < (const Elem &a, const Elem &b)

{

    if (a.age != b.age)

        return a.age > b.age;

    return strcmp(a.name, b.name) < 0;

}



int getid(char *name)

{

    for (int i = 0; i < dcount; i++)

        if (!strcmp(decendant[i].name, name))

            return i;

    strcpy(decendant[dcount].name, name);

    return dcount++;

}



void addedge(int a, int b, int w)

{

    edge[ncount].v = b;

    edge[ncount].w = w;

    edge[ncount].next = head[a];

    head[a] = ncount++;

}



void input()

{

    scanf("%d", &n);

    memset(head, -1, sizeof(head));

    strcpy(decendant[0].name, "Ted");

    decendant[0].age = 100;

    ncount = 0;

    dcount = 1;

    for (int i = 0; i < n; i++)

    {

        char name1[maxl];

        char name2[maxl];

        int w;

        scanf("%s%s%d", name1, name2, &w);

        int a = getid(name1);

        int b = getid(name2);

        addedge(a, b, w);

    }

}



void work()

{

    int front = 0, rear = 0;

    q[rear++] = 0;

    while (front != rear)

    {

        int u = q[front++];

        for (int i = head[u]; ~i; i = edge[i].next)

        {

            int v = edge[i].v;

            int w = edge[i].w;

            decendant[v].age = decendant[u].age - w;

            q[rear++] = v;

        }

    }

}



void output()

{

    printf("DATASET %d\n", ca);

    for (int i = 1; i <= n; i++)

        printf("%s %d\n", decendant[i].name, decendant[i].age);

}



int main()

{

    //freopen("t.txt", "r", stdin);

    int t;

    scanf("%d", &t);

    ca = 0;

    while (t--)

    {

        ca++;

        input();

        work();

        sort(decendant, decendant + n + 1);

        output();

    }

    return 0;

}

你可能感兴趣的:(poj)