描述
設有n個城市,編號爲0~n-1,m條單向航線的起點和終點由輸入提供,尋找一條換乘次數最少的線路方案。
輸入
第一行爲三個整數n、m、v,表示城市數、單向航線數和起點城市。以下m行每行兩個整數,表示一條邊的起點、終點,保證不重複、不失敗。2≤n≤20,1≤m≤190
輸出
共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;
}