链接:https://www.nowcoder.com/acm/contest/157/E
题目描述
有一只可爱的老青蛙,在路的另一端发现了一个黑的东西,想过去一探究竟。于是便开始踏上了旅途
一直这个小路上有很多的隧道,从隧道的a进入,会从b出来,但是隧道不可以反向走。
这只青蛙因为太老了,所以很懒,现在想请你帮帮慢,问他最少需要几步才可以到达对面。
将小径看作一条数轴,青蛙初始在0上,这只青蛙可以向前跳也可以向后跳,但每次只能跳一格,每跳一格记作一步,从隧道进到隧道出算做一步。
输入描述:
第一行两个数m,n;表示黑色物品在数轴m点上,数轴上总共有n个隧道 接下来n行,每行a,b两个数,表示从a进会从b出 10 <= m,n <= 233 0<a,b<=m输出描述:
一个数ans表示最小步数示例1
输入
复制
16 4 2 10 8 15 12 5 13 6输出
复制
7说明
0-->1-->2-->10-->9-->8-->15-->16
看别人的思路^-^
这个题要是用bfs,要想到青蛙有三中方法来走路,第一种是走隧道,第二种是向前跳一格,第三种是往后跳一格。当到了目的地n是返回路径长度就是最短路。还有一点就是每个隧道相当于一步。
不过代码是自己的,用的邻接矩阵的方法
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const int maxn1=500+5;
const int INF=1e8;
int dis[maxn1],a[maxn1][maxn1],vis[maxn1];
int main()
{
int m,n;
while(scanf("%d %d",&m,&n)!=EOF)
{
for(int i=0;i<=m;i++)
{
a[i][i]=0;
}
//初始化图的邻接矩阵;
for(int i=0;i<m;i++)
for(int j=i+1;j<=m;j++)
{
a[i][j]=j-i;
a[j][i]=a[i][j];
}
int x,y;
for(int i=0;i<n;i++)
{
scanf("%d %d",&x,&y);
a[x][y]=1;
}
memset(vis,0,sizeof(vis));
for(int i=1;i<=m;i++)
{
dis[i]=a[0][i];
}
vis[0]=1; //标记初始点;
//算法执行m-1次;
int mind,k;
for(int i=1;i<m;i++)
{
mind=INF;
for(int j=1;j<=m;j++)
{
if(dis[j]<mind&&vis[j]==0)
{
mind=dis[j];
k=j; //记录下当前离初始点最短距离的点且该点未被标记;
}
}
vis[k]=1; //标记这个点;
//松弛操作;
for(int j=0;j<=m;j++)
{
if(mind+a[k][j]<dis[j])
{
dis[j]=a[k][j]+mind;
}
}
}
cout<<dis[m]<<endl;
}
return 0;
}

269

被折叠的 条评论
为什么被折叠?



