西南科技大學OJ題 圖的按錄入順序廣度優先搜索1069

圖的按錄入順序廣度優先搜索

 5000(ms)

 10000(kb)

 2351 / 4887

Tags: 廣度優先

圖的廣度優先搜索類似於樹的按層次遍歷,即從某個結點開始,先訪問該結點,然後訪問該結點的所有鄰接點,再依次訪問各鄰接點的鄰接點。如此進行下去,直到所有的結點都訪問爲止。在該題中,假定所有的結點以“A”--“Z”中的若干字符表示,且要求結點的訪問順序根據錄入的順序進行訪問。如果結點錄入的順序爲HUEAK,要求從H開始進行廣度優先搜索,則可能的搜索結果爲:H->E->A->U->K.

輸入

第一行爲一個整數n,表示頂點的個數,第二行爲n個大寫字母構成的字符串,表示頂點,接下來是爲一個n*n大小的整數矩陣,表示圖的鄰接關係。數字爲0表示不鄰接,否則爲相應的邊的長度。最後一行爲一個字符,表示要求進行廣度優先搜索的起始頂點。

輸出

用一行輸出廣度優先搜索結果,起始點爲給定的頂點。

樣例輸入

5
HUEAK
0 0 2 3 0
0 0 0 7 4
2 0 0 0 0
3 7 0 0 1
0 4 0 1 0
H

樣例輸出

HEAUK

 

 

#include<iostream> 
#include<stdio.h>
using namespace std;
int map[100][100],n;int queue[100],a=0,b=0; //a,b分別爲queue的前標記和後標記 
struct Node
{
    char data;
    int flag;
}str[100];
void CreateMap()//創建鄰接矩陣 
{
    for(int i=0;i<n;i++) for(int j=0;j<n;j++) scanf("%d",&map[i][j]);
}
void BFS(int i)//廣度優先搜索 
{
    if(str[i].flag==0)//如果未被標記則輸出,並且標記爲1,將其入隊 
    {
        printf("%c",str[i].data);
        str[i].flag=1;
        queue[b++]=i;
    }
    while(a<b)
    {
        int t=queue[a++];//將隊頭出隊,取出 
        for(int j=0;j<n;j++)
        {
            if(map[t][j]!=0&&str[j].flag==0)//查找取出的序號對應的行 
            {
                printf("%c",str[j].data);
                str[j].flag=1;
                queue[b++]=j;
            }
        }
    }
}
int main()
{
    scanf("%d",&n);
    for(int i=0;i<n;i++)//輸入字符串,並且初始化標記 
    {
        cin>>str[i].data;//注意此處,要用這種輸入方式才能a 
        str[i].flag=0;
    }
    CreateMap();
    char top;
    cin>>top;//注意此處,要用這種輸入方式才能a 
    for(int i=0;i<n;i++)//找到字符對應的位置 
    {
        if(str[i].data==top)
        {
            BFS(i);
            break;
        }
    }
}
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章