HDU 2544 最短路

Problem Description
在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt。但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗?

 

Input
输入包括多组数据。每组数据第一行是两个整数N、M(N<=100,M<=10000),N表示成都的大街上有几个路口,标号为1的路口是商店所在地,标号为N的路口是赛场所在地,M则表示在成都有几条路。N=M=0表示输入结束。接下来M行,每行包括3个整数A,B,C(1<=A,B<=N,1<=C<=1000),表示在路口A与路口B之间有一条路,我们的工作人员需要C分钟的时间走过这条路。
输入保证至少存在1条商店到赛场的路线。
 

Output
对于每组输入,输出一行,表示工作人员从商店走到赛场的最短时间
 

Sample Input
   
   
   
   
2 1 1 2 3 3 3 1 2 5 2 3 5 3 1 2 0 0
 
Sample Output
    
    
    
    
3 2
思路:运用dijkstra算法求最短路径
import java.util.Arrays;
import java.util.Scanner;
public class Main {
	public static void main(String[] args){
		int maxnum=0x3f3f3f;
		Scanner cin=new Scanner(System.in);
		while(cin.hasNext()){
		int N=cin.nextInt();                      //N代表路口数
		int M=cin.nextInt();                      //M代表路数
		if(N==0&&M==0)break;
		int[][] graph=new int[200][200];
		int[] dist=new int[200];
		boolean[] isV=new boolean[200];
		Arrays.fill(isV, false); 
		
		for(int i=1;i<=N;i++){
			for(int j=1;j<=N;j++) 
			if(i==j)graph[i][j]=0;
			else graph[i][j] = maxnum; 
		}
		
		for(int i=0;i<M;i++){
			int p1=cin.nextInt();
			int p2=cin.nextInt();
			graph[p2][p1]=graph[p1][p2]=cin.nextInt();
		}
		
		for(int i=1;i<=N;i++){
			dist[i]=graph[1][i];
		}
	
		dist[1]=0;
		isV[1]=true;
		int min=0;
		int v=0;
		
		for(int i=1;i<N;i++){                                                   //关键代码
			min=maxnum;                                                     //..
			for(int j=1;j<=N;j++){
				if(isV[j]!=true&&dist[j]<min)
				{
					min=dist[j];
					v=j;
				}
				}
			isV[v]=true;
			for(int j=1;j<=N;j++){
				if(isV[j]!=true&&dist[j]>dist[v]+graph[v][j]){
					dist[j]=dist[v]+graph[v][j];
				}	
			}
		}
		System.out.println(dist[N]);
		
		}
	}
}

思路:运用Floyd算法求解最短路径
import java.nio.file.Path;
import java.util.*;
public class Main2544 {
	public static void main(String[] args){
		Scanner cin=new Scanner(System.in);
		int maxnum=0x3f3f3f;
		while(cin.hasNext()){
			int N=cin.nextInt();  //路口数
			int M=cin.nextInt();  //路数
			if(N==0&&M==0)break;
			int[][] graph=new int[200][200];
			int dist[][]=new int[200][200];
			boolean[] isV=new boolean[200];
			String[][] path=new String[200][200];
			Arrays.fill(isV, false); 
			
			for(int i=1;i<=N;i++){
				for(int j=1;j<=N;j++) 
				{if(i==j)graph[i][j]=0;
				else graph[i][j] = maxnum; 
				path[i][j]=new Integer(i).toString();
				}
			}
			for(int i=0;i<M;i++){
				int p1=cin.nextInt();
				int p2=cin.nextInt();
				graph[p2][p1]=graph[p1][p2]=cin.nextInt();
			}
			
			
			for(int i=1;i<=N;i++)
				for(int j=1;j<=N;j++){
					dist[i][j]=graph[i][j];
					if(dist[i][j]!=maxnum)path[i][j]="->"+new Integer(j).toString();
					else path[i][j]="";
				}
			for(int k=1;k<=N;k++)                                                //关键代码
				for(int i=1;i<=N;i++)                                        //可顺带求出途径路径
					for(int j=1;j<=N;j++)
						if(dist[i][k]+dist[k][j]<dist[i][j]){
							dist[i][j]=dist[i][k]+dist[k][j];
							path[i][j]=path[i][k]+path[k][j];
						}
			
			System.out.println(dist[1][N]);
		//	System.out.println(path[1][N]);
		}
		
	}
}



Sample Output
    
    
    
    
3 2

你可能感兴趣的:(最短路径,HDU,dijkstra,floyd)