本来是水的最短路,然而我用邻接表存边,强势wa无数发,尽管说有重边,我觉得不也是可以选最小边来搞,无法直视,最后妥协用数组存了
/*
最短路
Dijkstra、Ford、SPFA
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#define oo 0x3f3f3f3f
const int maxn = 2020;
using namespace std;
int n,t;
int dis[maxn],vis[maxn];
int mp[maxn][maxn];
int Djikstra(int s)
{
for(int i = 1; i <= n; i++)
{
dis[i] = mp[s][i];
vis[i] = 0;
}
vis[s] = 1;
int mi,k;
for(int i = 0; i < n; i++)
{
mi = oo;k=s;
for(int j = 1; j <= n; j++)
{
if(!vis[j]&&mi>dis[j])
{
mi = dis[j];
k = j;
}
}
if(k == s)continue;
vis[k] = 1;
for(int u = 1; u <= n; u++)
{
if(!vis[u]&&mp[k][u]!=oo)
{
if(dis[u]>dis[k]+mp[k][u])
dis[u] = dis[k]+mp[k][u];
}
}
}
return dis[1];
}
int main()
{
int u,v,val;
while(scanf("%d%d",&t,&n)!=EOF)
{
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
if(i==j)mp[i][j] = 0;
else mp[i][j] = oo;
while (t--)
{
scanf("%d%d%d",&u,&v,&val);
if(val<mp[u][v])
{
mp[u][v] = mp[v][u] = val;
}
}
printf("%d\n",Djikstra(n));
}
return 0;
}