传送门:HDU 2544
/*基本算法:
将图G中所有的顶点V分成两个顶点集合VA,VB;
如果源点S到顶点i的最短路径已经确定,则点i属于VA集合,否则属于集合VB;
*/
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <vector>
#include <set>
#include <map>
#define MAX 110
#define INF 0x3f3f3f3
using namespace std;
int Map[MAX][MAX];//构建地图
int dis[MAX];//点i到s源点的最短距离
int pre[MAX];//判断点i属于VA集合还是VB集合
void dijkstra(int n,int s)
{
int i,j,Min,tmp;
for(i=1;i<=n;i++)//初始化
{
dis[i]=Map[s][i];
pre[i]=0;//所有点都在VB中
}
pre[s]=1;//将源点存到VA中
for(i=1;i<=n;i++)//求源点S到所有点的最短路径
{
Min=INF;
for(j=1,tmp=0;j<=n;j++)//在VB中取到源点S距离最短的点
{
if(!pre[j]&&dis[j]<Min)
{
tmp=j;
Min=dis[j];
}
}
if(tmp==0) return;//如果找不到可以扩展的点,那么剩下的点都不能到达
pre[tmp]=1;
for(j=1;j<=n;j++)//更新源点S到点j的最短路径
{
if(!pre[j]&&dis[tmp]+Map[tmp][j]<dis[j])
dis[j]=dis[tmp]+Map[tmp][j];
}
}
}
int main()
{
int n,m,a,b,t,i,j;
while(scanf("%d%d",&n,&m)&&n&&m)
{
for(i=1;i<=n;i++)//初始化Map地图
for(j=1;j<=n;j++)
Map[i][j]=INF;
for(i=1;i<=m;i++)//赋值
{
scanf("%d%d%d",&a,&b,&t);
Map[a][b]=Map[b][a]=t;
}
dijkstra(n,1);
printf("%d\n",dis[n]);
}
return 0;
}