您的位置:首页 > 其它

63.队列:1.    寻找经过结点最少的路径

2016-03-12 05:48 239 查看
1.
寻找经过结点最少的路径

【例1图4表示的是从城市A到城市H的交通图。从图中可以看出,从城市A到城市H要经过若干个城市。现要找出一条经过城市最少的一条路线。

【算法分析】

看到这图很容易想到用邻接距阵来表示,0表示能走,1表示不能走。如图。


寻找经过结点最少的路径" title="63.队列:1. 寻找经过结点最少的路径">




寻找经过结点最少的路径" title="63.队列:1. 寻找经过结点最少的路径">


首先想到的是用队列的思想。a数组是存储扩展结点的队列,a[i]记录经过的城市,b[i]记录前趋城市,这样就可以倒推出最短线路。具体过程如下:

(1)

将城市A入队,队首为0、队尾为1。

(2)将队首所指的城市所有可直通的城市入队(如果这个城市在队列中出现过就不入队,可用一布尔数组s[i]来判断),将入队城市的前趋城市保存在b[i]中。然后将队首加1,得到新的队首城市。重复以上步骤,直到搜到城市H时,搜索结束。利用b[i]可倒推出最少城市线路。

代码:

#include

#include

using namespace std;

int a[10][10];// 0 biao shi ke
zou

int n;

int dl[90];

int pre[10],flag[10];//0 biao shi mei zou

void input()

{

scanf("%d",&n);

for(int i=1;i<=n;++i)

for(int j=1;j<=n;++j)

scanf("%d",&a[i][j]);

}

void print(int d)

{

if(pre[d]!=0)

print(pre[d]);

printf("%d->",d);

}

void BFS()

{

int head=0,tail=0;

++tail;

dl[tail]=1;

pre[1]=0;

flag[1]=1;//1 baio shi zou guo

while(head

{

++head;

for(int i=1;i<=n;++i)

{

if(!flag[i]&&!a[dl[head]][i])

{

flag[i]=1;

++tail;

dl[tail]=i;

pre[i]=dl[head];//bian hao

}

if(dl[tail]==n)

{

print(pre
);

head=tail;

break;

}

}

}

}

int main()

{

freopen("1.in","r",stdin);

input();

BFS();

printf("%d",n);

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: