[NOJ 1137] The Running Man
来源:互联网 发布:java 调用ant 编辑:程序博客网 时间:2024/06/06 02:44
题目链接:http://acm.nbut.cn/Problem/view.xhtml?id=1137
类型:最短路
题目大意:
先给你T个地点,从A -- (A+i-1)为止,然后给你N个连接道路(单向连接)的编号以及距离。最后你需要输出A点到其它点的最短路,如果没有则输出No。
题解:
考虑到这题是单源最短路,所以可以用Dijkstra来做。
赵巨巨:
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;
}
0 0
- [NOJ 1137] The Running Man
- NOJ--1137--The Running Man
- NOJ 1137 The Running Man
- the running man 【NOJ】
- SHU1919 Running Man,Bob(那罗延数)
- NOJ [1186] Get the Width
- NOJ [1374] Find The Law
- NOJ [1251] Find the Palindrome
- NOJ [1306] Divide The Apples
- NOJ [1285] The TT Candy
- NOJ [1296] Between The Island
- NOJ 1127 Kill the Zombies
- The Man I Killed
- The Mythical Man-Month
- Man In The Mddle
- the silence man,
- Running the MFC AppWizard
- Noj
- [HDOJ 1556] Color the ball(线段树成段更新入门)
- nbut 1058 火烧赤壁 2
- 杨辉三角
- [nbut 1405] bridge and island
- [1411] TT要吃肉
- [NOJ 1137] The Running Man
- 如何自己构造ADO的ConnectionString
- 有关SIP中的PRACK的含义和使用
- 自然对数
- outStream.flush()
- ubuntu13.04 使用halt机器没有关机的解决办法
- Codeforces Round #139 (Div. 2) E. Unsolvable
- XCode 同一Project创建多个target
- js实现图片上传预览