题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=2544
解法:基本的dijkstra
package hdu2544_shortestpath;
import java.util.Scanner;
/**
* submitted:Accepted
* algorithm:dijkstra
* @author Kindevil
*
*/
public class Main {
static int[][] G;
static int[] dist;
static boolean[] visit;
static int INF=0xFFFFFFF;
static int n,m;
static int a,b,c;
public static void main(String args[])
{
Scanner cin=new Scanner(System.in);
n=cin.nextInt();
m=cin.nextInt();
while( n!=0 && m!=0)
{
G=new int[n+1][n+1];
dist=new int[n+1];
visit=new boolean[n+1];
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(i==j) G[i][j]=0;
else G[i][j]=INF;
}
}
for(int i=0;i<m;i++)
{
a=cin.nextInt();
b=cin.nextInt();
c=cin.nextInt();
if(c<G[a][b]) G[a][b]=G[b][a]=c; //判重边
}
dijkstra(1);
System.out.println(dist[n]);
n=cin.nextInt();
m=cin.nextInt();
}
}
public static void dijkstra(int s)
{
for(int i=1;i<=n;i++)
{
dist[i]=G[s][i];
visit[i]=false;
}
visit[1]=true;
for(int x=2;x<=n;x++)//将n-1个顶点并入visit集合
{
int u=s;
int mindis=INF;
for(int i=2;i<=n;i++)
{
if(!visit[i] && dist[i]<mindis)
{
mindis=dist[i];
u=i;
}
}
visit[u]=true;
for(int i=1;i<=n;i++)
{
if(visit[i]) continue;
if(dist[i]>dist[u]+G[u][i])//松弛
{
dist[i]=dist[u]+G[u][i];
}
}
}
}
}