广度优先搜索

来源:互联网 发布:淘宝买到三无产品 编辑:程序博客网 时间:2024/05/20 04:47
struct Node{    int color;    int distance;    int prev;};enum COLOR{    WHITE, GRAY, BLACK};int BFS(int** matrix, int num_node,int source, int dest){    Node* node = new Node[num_node];    for (int i = 0; i < num_node; i++)    {        node[i].color = WHITE;        node[i].distance = 0x7fffffff;        node[i].prev = 0xffffffff;    }    queue<int> que;    int cur = source;    node[source].color = GRAY;    node[source].distance = 0;    que.push(cur);    while (!que.empty())    {        int cur = que.front();        que.pop();        for (int k = 0; k < num_node; k++)        {            if (matrix[cur][k] == 1 && node[k].color == WHITE)            {                que.push(k);                node[k].color = GRAY;                node[k].prev = cur;                node[k].distance = node[cur].distance + 1;            }        }        node[cur].color = BLACK;    }    printf("dis from %d to %d is %d\n", source, dest, node[dest].distance);    cur = dest;    printf("path is \n");    while (cur != source)    {        printf("%d\t", cur);        cur = node[cur].prev;    }    printf("%d\n", cur);    return node[dest].distance;}int main(){    int num_node, num_vert;    int binary_vertex;    FILE* fp = fopen("input.txt", "r");    char buf[1024];    if (fscanf(fp, "%d %d %d\n", &num_node, &num_vert,&binary_vertex) != 3)    {        fprintf(stderr, "\nfscanf error: %s: %d\n", strerror(errno), errno);        exit(1);    }    int** matrix = new int*[num_node];    for (int i = 0; i < num_node; i++)    {        matrix[i] = new int[num_node];        memset(matrix[i], 0, num_node * sizeof(int));    }    while (fgets(buf, 1024, fp) != NULL)    {        int begin, end;        if (sscanf(buf, "%d %d\n", &begin, &end) != 2)        {            fprintf(stderr, "\nsscanf error: %s: %d\n", strerror(errno), errno);            exit(1);        }        if (binary_vertex == 1)        {            matrix[end][begin] = 1;        }        matrix[begin][end] = 1;    }    for (int i = 0; i < num_node; i++)    {        for (int j = 0; j < num_node; j++)        {            printf("%4d",matrix[i][j]);        }        printf("\n");    }    int source = 4;    int dest = 2;    int dis = BFS(matrix,num_node, source, dest);    return 0;}----------DFS----------struct DFSNode{    int color;    int prev;    int time_start;    int time_finish;};int time = 0;void DFSVisit(int** matrix, DFSNode* node,int num_node,int node_index){    time++;    node[node_index].color = GRAY;    node[node_index].time_start = time;    for (int k = 0; k < num_node; k++)    {        if (node[k].color == WHITE&&matrix[node_index][k] == 1)        {            node[k].prev = node_index;            DFSVisit(matrix, node, num_node, k);        }    }    node[node_index].color = BLACK;    time++;    node[node_index].time_finish = time;}int DFS(int** matrix, int num_node, int source, int dest){    DFSNode* node = new DFSNode[num_node];    for (int i = 0; i < num_node; i++)    {        node[i].color = WHITE;        node[i].prev = 0xffffffff;        node[i].time_start = 0;        node[i].time_finish = 0;    }    for (int k = 1; k < num_node; k++)    {        if (node[k].color == WHITE)        {            DFSVisit(matrix, node,num_node, k);        }    }    //int cur = dest;    //printf("path is \n");    //while (cur != source)    //{    //  printf("%d\t", cur);    //  cur = node[cur].prev;    //}    //printf("%d\n", cur);    printf("time:\n");    for (int i = 1; i < num_node; i++)    {        printf("node %d: start = %d, finish = %d\n", i, node[i].time_start, node[i].time_finish);    }    return 0;}
原创粉丝点击