飛機最小換乘次數&寬度優先遍歷(bfs)

描述

設有n個城市,編號爲0n-1m條單向航線的起點和終點由輸入提供,尋找一條換乘次數最少的線路方案。

輸入

第一行爲三個整數nmv,表示城市數、單向航線數和起點城市。以下m行每行兩個整數,表示一條邊的起點、終點,保證不重複、不失敗。2n201m190

輸出

n-1行,分別是從起點城市v到其他n-1個城市最少換乘次數,按照終點城市序號從小到大順序輸出,不能抵達時輸出-1

樣例輸入

3 2 0
0 1
1 2

樣例輸出

1
2

#include <iostream>
#include <list>
using namespace std;
int b[20];
int a[20][20]={0};
bool *visit;
int n,m,v;
void bfs(int v)
{
list<int> q;
int tmp=v,j=1;
q.push_back(v);
visit[v]=true;
while(q.size()>0)
{
tmp=q.front();
q.pop_front();
for(int i=0;i<n;++i)
{
if(a[tmp][i]!=0&&!visit[i])
{
q.push_back(i);//寬度優先就是先將矩陣的每一行滿足條件的節點壓如隊列中
visit[i]=true;
b[i]=j;
}
}
j++;//矩陣每一行代表一次換乘
}

}
int _tmain(int argc, _TCHAR* argv[])
{
int x,y;
cin>>n>>m>>v;
visit=new bool[n];
while(m--)
{
cin>>x>>y;
a[x][y]=1;//建立矩陣,連通的爲1,否則爲0
}
for(int i=0;i<n;++i)
{
visit[i]=false;
b[i]=-1;//b用來存放換乘數
}
bfs(v);
for(int i=0;i<n;++i)
{
if(i!=v)
{
cout<<b[i]<<endl;
}
}
delete []visit;
return 0;
}

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