#include<iostream>
#include<cstdio>
#include<string.h>
using namespace std;
#define inf 0xffffff
const int MAXN = 1005;
int maze[MAXN][MAXN], vis[MAXN], mincost[MAXN];
//mincost[i]记录的已经标记的节点(s1)到其他节点i(s2)的权值的最小值
int n, t;
int dijkstra(int v)
{
for(int i = 1; i <= n; i++)
mincost[i] = maze[v][i];//以v节点初始化
vis[v] = 1;//把v标记,记录到集合s1中
int sum =0, k;
for(int i = 2; i <= n; i++)//寻找n -1次
{
//sum = 0;
int mina = inf;
for(int j = 1; j <= n; j++)
{
if(mincost[j] < mina && !vis[j])
{//找到集合s2中最小的权值累加并加入到集合s1中
mina = mincost[j]; k = j;
}
}
sum += mina;vis[k] = 1;
//cout << sum << endl;
for(int j = 1; j <= n; j++)//因为S1集合加入了节点k,所以要更新lowcost
//lowcost更新为已经找到的节点到集合S2中的距离(map[k][j]),和原来S1集合
//(未加入K)时候到集合S2中的距离的较小值,这个值才是当前S1集合到S2集合
//中距离最小的点。
{
if(mincost[j] > maze[k][j] + mina && !vis[j])
{
mincost[j] = maze[k][j] + mina;
}
}
}
return mincost[n];
}
int main()
{
//freopen("input.txt", "r", stdin);
cin >> t >> n;
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= n; j++)
{
//if(i == j)
// maze[i][i] = 0;
maze[i][j] = maze[j][i] = inf;
}
}
for(int i = 1; i <= t; i++)
{
int a, b, c;
cin >> a >> b >> c;
if(maze[a][b] > c)
maze[a][b] = maze[b][a] = c;
}
cout << dijkstra(1) << endl;
return 0;
}
[NWPU][2014][TRN][18]最短路问题 A - 模板 POJ 2387
最新推荐文章于 2024-08-12 08:24:43 发布