acm-hdu1548解题报告
2015-08-01 20:30
387 查看
题目网址:http://acm.hdu.edu.cn/showproblem.php?pid=1548
题目大意:电梯固定每次可上下层数,问最短路
解题思想:Dijkstra
代码:
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <algorithm>
using namespace std;
#define inf 0x7f7f7f
#define maxn 250
int dis[maxn],map[maxn][maxn],buttom[maxn];
int n;
bool vis[maxn];
void Dijkstra(int start,int finish)
{
for(int i=1;i<=n;i++ )
{
vis[i]=false;
dis[i]=map[start][i];
}
vis[start]=true;
dis[start]=0;
int temp,k;
for(int i=1 ; i<=n ; i++ )
{
temp=inf;
for( int j=1;j<=n;j++)
{
if(!vis[j]&&temp>dis[j])
temp = dis[k=j];
}
if(temp==inf)break;
vis[k]=true;
for(int j=1;j<=n;j++ )
if(!vis[j]&&dis[j]>map[k][j]+dis[k])dis[j]=map[k][j]+dis[k];
}
}
int main()
{
int start,finish;
while(scanf("%d",&n)&&n!=0)
{
scanf("%d%d",&start,&finish);
for(int i=1;i<=n;i++ )
for(int j=1;j<=n;j++ )
map[i][j]=inf;
for(int i=1;i<=n;i++ )
{
scanf("%d",&buttom[i]);
if(i+buttom[i]<=n)map[i][i+buttom[i]]=1;
if(i-buttom[i]>=1)map[i][i-buttom[i]]=1;
}
Dijkstra(start,finish );
if(dis[finish]==inf )printf("-1\n");
else printf("%d\n",dis[finish]);
}
return 0;
}
题目大意:电梯固定每次可上下层数,问最短路
解题思想:Dijkstra
代码:
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <algorithm>
using namespace std;
#define inf 0x7f7f7f
#define maxn 250
int dis[maxn],map[maxn][maxn],buttom[maxn];
int n;
bool vis[maxn];
void Dijkstra(int start,int finish)
{
for(int i=1;i<=n;i++ )
{
vis[i]=false;
dis[i]=map[start][i];
}
vis[start]=true;
dis[start]=0;
int temp,k;
for(int i=1 ; i<=n ; i++ )
{
temp=inf;
for( int j=1;j<=n;j++)
{
if(!vis[j]&&temp>dis[j])
temp = dis[k=j];
}
if(temp==inf)break;
vis[k]=true;
for(int j=1;j<=n;j++ )
if(!vis[j]&&dis[j]>map[k][j]+dis[k])dis[j]=map[k][j]+dis[k];
}
}
int main()
{
int start,finish;
while(scanf("%d",&n)&&n!=0)
{
scanf("%d%d",&start,&finish);
for(int i=1;i<=n;i++ )
for(int j=1;j<=n;j++ )
map[i][j]=inf;
for(int i=1;i<=n;i++ )
{
scanf("%d",&buttom[i]);
if(i+buttom[i]<=n)map[i][i+buttom[i]]=1;
if(i-buttom[i]>=1)map[i][i-buttom[i]]=1;
}
Dijkstra(start,finish );
if(dis[finish]==inf )printf("-1\n");
else printf("%d\n",dis[finish]);
}
return 0;
}
相关文章推荐
- 动易2006序列号破解算法公布
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- c语言实现的带通配符匹配算法
- 浅析STL中的常用算法
- 算法之排列算法与组合算法详解
- C++实现一维向量旋转算法
- Ruby实现的合并排序算法
- C#折半插入排序算法实现方法
- 基于C++实现的各种内部排序算法汇总
- C++线性时间的排序算法分析
- C++实现汉诺塔算法经典实例
- PHP实现克鲁斯卡尔算法实例解析
- C#获取关键字附近文字算法实例