network of emergency contacts---BFS

本题目的主要难点在如何寻找最后一层的数,利用book标记数组可以很好的解决问题。book=0的时候说明没被连接过,若要连接时,将book等于上一层book+1.

需要注意的是,对于图的问题建立邻接矩阵是非常省时间的方法。类似这个道题,我没有用邻接矩阵,因此每次都要进入150的for循环。但是如果用矩阵,最多则是每次100的循环。这样对于n*n*n.....来说则会剩下很多时间。

#include<stdio.h>
#include<stdlib.h>
typedef struct{
    int a[300];
    int rear;
    int head;
}queue;
queue q;
int A[150],B[150];
int book[300];
int test(int data[300],int startNum);
void build(int data[300]){
    for(int i=0;i<300;i++)
        data[i]=rand()%100+1;
}
void main(){
    //freopen("intput.txt","r",stdin);
    int data[300];
    for(int l=0;l<10;l++){
        build(data);
        printf("%d\n",test(data,data[0]));
    }
}
int test(int data[300],int startNum){
    for(int i=0;i<300;i++)
        book[i]=0;
    for(int i=0,j=0;i<299;j++){          //将数据分为两个数组中A表示边的出发点,B表示边的终点
        A[j]=data[i];
        B[j]=data[i+1];
        i=i+2;
    }
    q.rear=0;
    q.head=0;
    q.a[q.rear++]=startNum;
    book[startNum]=1;
    while(q.head<q.rear){
        int temp=q.a[q.head++];
        for(int i=0;i<150;i++){
            if(A[i]==temp&&book[B[i]]==0){
                q.a[q.rear++]=B[i];
                book[B[i]]=book[A[i]]+1;     //标记层数
            }
        }
    }
    int c=0;
    int max=0;
    for(int i=0;i<=299;i++){            //寻找最大层数
        if(c<book[i]){
            c=book[i];
        }
    }
    for(int i=299;i>=0;i--){            //寻找最大层数总最大值
        if(book[i]==c){
            max=i;
            break;
        }
    }
    return max;
}

 

posted @ 2017-03-22 15:49  Mr.Struggle  阅读(239)  评论(0编辑  收藏  举报