63.队列:1. 寻找经过结点最少的路径
2016-03-12 05:48
323 查看
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;
}
寻找经过结点最少的路径
【例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;
}
相关文章推荐
- [leetcode] 276. Paint Fence 解题报告
- 扫扫土,开工啦~
- Android ImageSlider实现广告轮播
- hdu1061(快速幂取余)
- 我是刘杰,欢迎参观我的博客
- Bullet物理引擎在OpenGL中的应用
- SlidingPaneLayout、Navigation Drawer、drawerlayout
- import information website
- Handler机制在秒表中的运用
- 216. Combination Sum III
- 思维导图|心智图|脑图 学习小结
- Handler消息机制之基础代码运用篇(3)
- 40. Combination Sum II
- python之路--Django
- UESTC 1143 传输数据 网络流 最大流 Dinic
- ${pageContext.request.contextPath} JSP取得绝对路径
- Django--登录实例
- Handler消息机制之基础代码运用篇(2)
- 操作系统常见面试题总结
- CentOS6.3+vsftpd+mysql+pam_mysql实现虚拟用户管理的ftp服务器