这是一个简单的最短路问题。题意:给定有N个地点(编号从1到N),T条道路,先输入两个正整数T和N,然后接下来T行,每行三个整数,分别代表这条道路的起点终点和长度。要求求出从N到1的最短路、、、
解法:不能用Floyd,因为节点达到了1000,Floyd的时间复杂度为O(n的三次方),会TLE。用普通的Dijkstra就行了。
注意:题目数据有些坑、、、题目意思是说道路最大长度不超过100,但是实际上可能达到了几十万,因此建议将最大值调大一些。而且,输入会有重边,这点很容易忽略。另外,此题是多case的。
接下来是解题代码:Dijkstra解法
#include <stdio.h>
#define N 2001
#define MAX 99999999
int map[N][N]; //建立图,map[i][j]代表i到j的距离
int dis[N]; //dis[i]代表起点到i的距离
int flag[N]; //标记变量
int t, n;
void Init(); //初始化
void Read(); //输入
void Dijkstra();
int main()
{
while (~scanf("%d %d", &t, &n))
{
Init();
Read();
Dijkstra();
printf("%d\n", dis[1]);
}
return 0;
}
void Init() //初始化
{
int i, j;
for (i=0; i<N; i++)
{
for (j=0; j<N; j++)
{
map[i][j] = MAX;
}
flag[i] = 0;
dis[i] = MAX;
}
return;
}
void Read() //输入
{
int i;
int a, b, len;
for (i=0; i<t; ++i)
{
scanf("%d %d %d", &a, &b, &len);
if (map[a][b] > len) //解决重边问题
{
map[a][b] = map[b][a] = len;
}
}
return;
}
void Dijkstra()
{
int i, j, k;
int min;
dis[n] = 0;
for (i=1; i<=n; ++i)
{
min = MAX;
for (j=1; j<=n; ++j)
{
if (flag[j] == 0 && dis[j] < min)
{
min = dis[k = j];
}
}
flag[k] = 1;
for (j=1; j<=n; ++j)
{
if (dis[j] > dis[k] + map[k][j])
{
dis[j] = dis[k] + map[k][j];
}
}
}
return;
}