1 10 1 1 9 1 8 8 10 10 3 8 6 1 2 10 4 9 5 3 7
-1 1 10 10 9 8 3 1 1 8
该题就是将图用邻接表建立起来后,直接进行深搜一遍就完事!
- #include <stdio.h>
- #include <stdlib.h>
- #include <queue>
- #include <iostream>
- #define Max 100001
- using namespace std;
- typedef struct ele{
- int v;
- struct ele *next;
- }ele;
- int parent[Max];
- int N;
- typedef struct Graph {
- ele *vertex;
- }Graph;
- void bfs(int v, Graph *g);
- void insert_graph (Graph *g, int a, int b);
- void init_graph (Graph *g);
- int main (){
- Graph g[100001];
- int M, S;
- int a, b, i;
- scanf("%d", &M);
- while (M--){
- scanf("%d %d", &N, &S);
- init_graph(g);
- for(i = 0 ; i < N - 1; i++){
- scanf("%d %d", &a, &b);
- insert_graph (g, a, b);
- }
- bfs(S, g);
- parent[S] = -1;
- for(i = 1; i <= N; i++) {
- printf("%d ", parent[i]);
- }
- printf("\n");
- }
- }
- void bfs(int v, Graph *g){
- queue <int>q;
- int i, var;
- ele *e;
- int visited[Max] = {0};
- q.push(v);
- while(!q.empty()){
- var = q.front();
- q.pop();
- for(e = g[var].vertex; e != NULL; e = e -> next){
- if(!visited[e -> v]){
- visited[e -> v] = 1;
- parent[e ->v] = var;
- q.push(e -> v);
- }
- }
- }
- }
- void insert_graph(Graph *g, int a, int b){
- ele *temp = (ele *) malloc (sizeof(ele));
- ele *temp1 = (ele *) malloc (sizeof(ele));
- temp -> v = b;
- temp1 ->v = a;
- if(g[a].vertex == NULL){
- g[a]. vertex = temp;
- temp -> next = NULL;
- }
- else{
- temp -> next = g[a].vertex;
- g[a].vertex = temp;
- }
- if(g[b].vertex == NULL) {
- g[b].vertex = temp1;
- temp1 -> next = NULL;
- }
- else{
- temp1 ->next = g[b].vertex;
- g[b].vertex = temp1;
- }
- }
- void init_graph(Graph *g){
- int i;
- for(i = 0; i <= N; i++){
- g[i].vertex = NULL;
- }
- }
原文:http://blog.csdn.net/huntinggo/article/details/19295877