圖的按錄入順序廣度優先搜索
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;
}
}
}