我陷入的坑是:每两个城镇之间可能有多条路,我开始以为只有一条路。修改后AC。
#include <iostream>
using namespace std;
int N[210][210];
int main()
{
int *pre, *dist, *f;
int n, m;
int i, j;
int a, b, c;
int src, dst;
while (EOF != scanf("%d %d", &n, &m))
{
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
if (i != j)
{
N[i][j] = INT_MAX;
}
else
{
N[i][j] = 0;
}
}
}
while (m--)
{
cin >> a >> b >> c;
if (c < N[a][b])
{
N[a][b] = c;
N[b][a] = c;
}
}
cin >> src >> dst;
dist = (int*)malloc(sizeof(int)*(n));
pre = (int*)malloc(sizeof(int)*(n));
f = (int*)malloc(sizeof(int)*(n));
for (i = 0; i < n; i++)
{
f[i] = 0;
dist[i] = N[src][i];
if (INT_MAX == dist[i]) { pre[i] = 0; }
else pre[i] = src;
}
f[src] = 1;
for (i = 1; i < n; i++)
{
int u = src;
int temp = INT_MAX;
for (j = 0; j < n; j++)
{
if (!f[j] && dist[j] < temp)
{
u = j;
temp = dist[j];
}
}
f[u] = 1;
for (j = 0; j < n; j++)
{
if (!f[j] && N[u][j]<INT_MAX)
{
int newDist = dist[u] + N[u][j];
if (newDist < dist[j])
{
dist[j] = newDist;
pre[j] = u;
}
}
}
}
if (INT_MAX == dist[dst]) { cout << -1 << endl; }
else cout << dist[dst] << endl;
free(dist);
free(pre);
free(f);
}
return 0;
}