这道题目原来已经a过了,应该用的是dijstra算法
这次用spfa。
只需要注意一点,有重边,所以保存邻接矩阵的时候一定要判断一下。
#include <stdio.h>
#define maxN 1002
#define inf 1000000000
int mat[maxN][maxN];//邻接矩阵
bool flag[maxN][maxN];//标示矩阵
int dis[maxN];//距离
bool vis[maxN];//标示数组
int queue[40 * maxN];//spfa队列
int t,n;
void Init()//初始化
{
for (int i = 1; i <= n; ++ i)
{
for (int j = 1; j <= n; ++ j)
{
mat[i][j] = inf;
flag[i][j] = false;
}
dis[i] = inf;
vis[i] = false;
}
}
void spfa()//spfa算法
{
int head = 0, tail = 1;
queue[0] = n;
dis[n] = 0;
while (head < tail)
{
int u = queue[head];
vis[u] = true;
for (int i = 1; i <= n; ++ i)
{
if (flag[u][i] && dis[i] > dis[u] + mat[u][i])
{
dis[i] = dis[u] + mat[u][i];
if (!vis[i])
{
vis[i] = true;
queue[tail] = i;
tail ++;
}
}
}
vis[u] = false;
head ++;
}
printf("%d\n", dis[1]);
}
int main()
{
while (scanf("%d%d", &t, &n) != EOF)
{
int a, b, c;
Init();
for (int i = 0; i < t; ++ i)
{
scanf("%d%d%d", &a, &b, &c);
if (flag[a][b])
{
if (mat[a][b] > c)
{
mat[a][b] = c;
}
}
else
{
mat[a][b] = c;
flag[a][b] = true;
}
if (flag[b][a])
{
if (mat[b][a] > c)
{
mat[b][a] = c;
}
}
else
{
mat[b][a] = c;
flag[b][a] = true;
}
}
spfa();
}
return 0;
}