题目来源:poj 2387
坑:有重边
#include <iostream>
#include <vector>
using namespace std;
const int maxn = 1010;
const int INF = 0x3ffffff;
int G[maxn][maxn];
bool vis[maxn] = {false};
int dis[maxn];
int N, S;
int Dijkstra(int s)
{
dis[s] = 0;
for (int i = 1; i <= N; i++) //循环n次
{
int u = -1; //使d[u]最小且还没有被访问的结点
int min = INF;
for (int j = 1; j <= N; j++)
{
if (vis[j] == false && dis[j] < min)
{
u = j;
min = dis[j];
}
}
if (u == -1)
{
break;
}
vis[u] = true;
for (int i = 1; i <= N; i++)
{
if (vis[i] == false && G[u][i] != INF && dis[i] > dis[u] + G[u][i])
{
dis[i] = dis[u] + G[u][i];
}
}
}
return dis[1];
}
int main()
{
int T;
cin >> T >> N;
fill(G[0], G[0] + maxn * maxn, INF);
fill(vis, vis + maxn, false);
fill(dis, dis + maxn, INF);
int u, v, w;
for (int i = 1; i <= T; i++)
{
scanf("%d %d %d", &u, &v, &w);
if (G[u][v] != INF)
{
if (G[u][v] > w)
{
G[u][v] = G[v][u] = w;
}
}
else
{
G[u][v] = G[v][u] = w;
}
}
cout << Dijkstra(N) << endl;
return 0;
}