最基本的最短路问题
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int INF = 0x3f3f3f3f;
int edge[2005][2005];
int main()
{
int n, k;
cin >> k >> n;
int v, u, dis;
for (int i = 0; i != n; ++i)
for (int j = 0; j != n; ++j)
edge[i][j] = INF;
for (int i = 0; i != k; ++i) // 无向图 建立双向边
{
scanf("%d%d%d",&v,&u,&dis);
if (edge[v-1][u-1] >= dis)
edge[v-1][u-1] = dis;
if (edge[u-1][v-1] >= dis)
edge[u-1][v-1] = dis;
}
int vis[2005],d[2005];
memset(d,0,sizeof(d));
memset(vis,0,sizeof(vis));
for (int i = 1; i != n; ++i)
d[i] = INF;
for (int i = 0; i != n; ++i)
{
int point;
int minn = INF;
for (int j = 0; j != n; ++j)
if (!vis[j] && d[j] < minn)
{
minn = d[j];
point = j;
}
vis[point] = 1;
for (int j = 0; j != n; ++j)
if (!vis[j])
d[j] = min(d[j],d[point] + edge[point][j]); //*松弛
}
cout << d[n-1] << endl;
return 0;
}