题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2544
#include <iostream>
#include <string.h>
#define MAX 10000005
#define N 10005
using namespace std;
/****************************************************************************************************************
题意:找到规定起点终点的单源最短路经
思路:
1,dijkstra算法,看到一个大牛的blog,一张表格让我顿悟了
2,dijkstra可以解决又向无向图,无向图给边赋较小的权值,有向图权值为1
3,切记dijkstra不能解决负权图
****************************************************************************************************************/
int visit[N]; //用来判断是非在特殊路径集合点内
int dist[N];
int a[N][N];
int dijkstra(int n)
{
for(int i = 1;i <= n;i ++)
dist[i]=a[1][i];
memset(visit,0,sizeof(visit));
dist[1]=0;
visit[1]=1;
for(int i = 2;i <= n;i ++){
int id=1,ansN=MAX;
for(int j = 2;j <= n;j ++){
if(!visit[j] && dist[j] < ansN){ //在S集合外找出最小路径点(即非特殊路径)
ansN=dist[j];
id=j;
}
}
visit[id]=1;
for(int j = 2;j <= n;j ++){ //以找到的最小路径点为最优解进行动态更新(非特殊路径集合点内遍历)
if(!visit[j] && a[id][j] < MAX)
dist[j]=min(dist[j],dist[id]+a[id][j]);
}
}
}
int main()
{
int n,m;
while(cin>>n>>m)
{
if(n == 0 && m == 0) break;
for(int i = 1;i <= n;i ++){
for(int j = 1;j <= n;j ++)
a[i][j]=MAX;
dist[i]=MAX;
}
//memset(dist,MAX,sizeof(dist));
int tempa,tempb,tempc;
for(int i = 1;i <= m;i ++){
cin>>tempa>>tempb>>tempc;
if(tempc < a[tempa][tempb]){ //无向图,保存两次
a[tempa][tempb]=tempc;
a[tempb][tempa]=tempc;
}
}
dijkstra(n);
cout<<dist[n]<<endl;
}
return 0;
}