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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章