题目大意:
在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt。但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗?
输入:
输入包括多组数据。每组数据第一行是两个整数N、M(N<=100,M<=10000),N表示成都的大街上有几个路口,标号为1的路口是商店所在地,标号为N的路口是赛场所在地,M则表示在成都有几条路。N=M=0表示输入结束。接下来M行,每行包括3个整数A,B,C(1<=A,B<=N,1<=C<=1000),表示在路口A与路口B之间有一条路,我们的工作人员需要C分钟的时间走过这条路。<br>输入保证至少存在1条商店到赛场的路线。
输出:
对于每组输入,输出一行,表示工作人员从商店走到赛场的最短时间
解题思路:
这道题是中文的题面,所以题意理解比较简单。看完题目之后,知道这是一道求单源点最短路径问题。因为这道题目的边的权值全是正数,所以我选择Dijkstra算法。用邻接矩阵存储边结构,二维数组。然后全部初始化为maxint,然后dist数组也同样初始化为maxint,之后在输入边的信息的时候给二维数组c[][]赋值的时候注意了,因为这是一道无向图的问题,因此不仅c[a][b]=m,而且c[b][a]=m,我就是错在了这里,之后具体的算法就是课件上抄的了,然后自己在主函数里面初始化。
感想:
其实对这个算法真的不理解,但是靠着课件上的算法的代码,然后加上自己的一部分理解,初始化了数组之后,没想到过了。
代码如下:
#include<iostream>
using namespace std;
#define NUM 100
#define maxint 10000
void dijkstra(int n, int v, int dist[], int prev[], int c[][NUM])
{
int i, j;
bool s[NUM];
for (i = 1; i <= n; i++)
{
if(c[v][i]!=maxint)
dist[i] = c[v][i];
s[i] = false;
if (dist[i] = maxint)
prev[i] = 0;
else
prev[i] = v;
}
dist[v] = 0;
s[v] = true;
for (i = 1; i < n; i++)
{
int temp = maxint;
int u = v;
for (j = 1; j <= n; j++)
{
if (!s[j] && dist[j] < temp)
{
u = j;
temp = dist[j];
}
}
s[u] = true;
for (j = 1; j <= n; j++)
{
if (!s[j] && c[u][j] < maxint)
{
int newdist = dist[u] + c[u][j];
if (newdist < dist[j])
{
dist[j] = newdist;
prev[j] = u;
}
}
}
}
}
int main()
{
int n,m, v, dist[NUM], prev[NUM], c[20][NUM],a,b,time;
while (cin >> n)
{
cin >> m;
if (n == 0 && m == 0)
break;
for (int i = 1; i <= n; i++)
{
dist[i] = maxint;
for (int j = 1; j <= n; j++)
c[i][j] = maxint;
}
for (int i = 1; i <= m; i++)
{
cin >> a >> b >> time;
c[a][b] = time;
c[b][a] = time;
}
dijkstra(n, 1, dist, prev, c);
cout << dist[n] << endl;
}
return 0;
}