[NOJ 1137] The Running Man

题目链接:http://acm.nbut.cn/Problem/view.xhtml?id=1137


类型:最短路

题目大意:
先给你T个地点,从A -- (A+i-1)为止,然后给你N个连接道路(单向连接)的编号以及距离。最后你需要输出A点到其它点的最短路,如果没有则输出No。


题解:
考虑到这题是单源最短路,所以可以用Dijkstra来做。

赵巨巨: [NOJ 1137] The Running Man - CodeTank - CodeTank的博客

dijstra算法

单源最短路问题,先加入源,维持一张表来保存此时到源中的最短距离,选取最小的加入,然后更新表,不断的加入直到目的地在源中。仅适用于正边权的时侯,因为这时我们可以保证任意加入的点已经找到了源到该点的距离。


完整代码:

#include<stdio.h>
#define INF 1<<30

int n,m;
int map[50][50];//储存两点间的距离
int low[50]; //储存当前点可到的点的最小距离
bool v[50]; //标记该点是否已被用过

void Dijkstra()
{
int pos;
int i,j;
low[0]=0; //将初始点到初始点的距离标记为0
for(i=0;i<n;i++)
{
int min=INF;
for(j=0;j<n;j++) //找到当前的最优点
{
if(!v[j]&&map[0][j]<min)
{
min=map[0][j];
pos=j;
}
}
v[pos]=1;
for(j=0;j<n;j++) //更新起始点到各点的最短距离
{
if(map[0][pos]+map[pos][j]<map[0][j])
{
map[0][j]=map[0][pos]+map[pos][j];
}
}
}
}


int main()
{
int i,j;
while(~scanf("%d%d",&n,&m))
{
getchar();
for(i=0;i<50;i++)
{
v[i]=0; //初始化标记数组
for(j=0;j<50;j++)
map[i][j]=INF; //将i点到j点标记为不可达
}
for(i=0;i<m;i++)
{
char a,b;
int A,B,w;
scanf("%c %c%d",&a,&b,&w);
A=a-'A';
B=b-'A';
if(w<map[A][B]) map[A][B]=w;
getchar();
}
Dijkstra();
for(i=1;i<n;i++)
{
printf("%c %c ",'A','A'+i);
if(map[0][i]>3000000||map[0][i]<0)
printf("No\n");
else
printf("%d\n",map[0][i]);
}
}
return 0;
}


你可能感兴趣的:([NOJ 1137] The Running Man)