1. 程式人生 > >ccf認證交通規劃0分

ccf認證交通規劃0分

試題編號: 201609-4
試題名稱: 交通規劃
時間限制: 1.0s
記憶體限制: 256.0MB
問題描述: 問題描述   G國國王來中國參觀後,被中國的高速鐵路深深的震撼,決定為自己的國家也建設一個高速鐵路系統。
  建設高速鐵路投入非常大,為了節約建設成本,G國國王決定不新建鐵路,而是將已有的鐵路改造成高速鐵路。現在,請你為G國國王提供一個方案,將現有的一部分鐵路改造成高速鐵路,使得任何兩個城市間都可以通過高速鐵路到達,而且從所有城市乘坐高速鐵路到首都的最短路程和原來一樣長。請你告訴G國國王在這些條件下最少要改造多長的鐵路。 輸入格式   輸入的第一行包含兩個整數nm
,分別表示G國城市的數量和城市間鐵路的數量。所有的城市由1到n編號,首都為1號。
  接下來m行,每行三個整數abc,表示城市a和城市b之間有一條長度為c的雙向鐵路。這條鐵路不會經過ab以外的城市。 輸出格式   輸出一行,表示在滿足條件的情況下最少要改造的鐵路長度。 樣例輸入 4 5
1 2 4
1 3 5
2 3 2
2 4 3
3 4 2 樣例輸出 11 評測用例規模與約定   對於20%的評測用例,1 ≤ n ≤ 10,1 ≤ m ≤ 50;
  對於50%的評測用例,1 ≤ n ≤ 100,1 ≤ m ≤ 5000;
  對於80%的評測用例,1 ≤ n ≤ 1000,1 ≤ m ≤ 50000;
  對於100%的評測用例,1 ≤ n
 ≤ 10000,1 ≤ m ≤ 100000,1 ≤ ab ≤ n,1 ≤ c ≤ 1000。輸入保證每個城市都可以通過鐵路達到首都。
使用單源最短路徑的dijkstra演算法,邊計算起點到各點的最短路徑,邊計算其中需要增加的鐵路的最短長度,因為到最後遍歷出來的邊是最小路徑,(prim演算法和dijkstra演算法的相似性),得出的結果任意兩點都是可達的。
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.List;
import java.util.Queue;
import java.util.Scanner;


public class Main1 {
	static int INT_MAX=10000;
	public static void main(String[] args) {
		Scanner scanner=new Scanner(System.in);
		int v=scanner.nextInt();
		int e=scanner.nextInt();
		Vex[] vex=new Vex[v+1];
		for (int i = 1; i <= v; i++) {
			vex[i]=new Vex();
		}
		for (int i = 0; i < e; i++) {
			int from=scanner.nextInt();
			int to=scanner.nextInt();
			int cost=scanner.nextInt();
			Edge edge=new Edge(to, cost);
			vex[from].edges.add(edge);
			edge=new Edge(from, cost);
			vex[to].edges.add(edge);
		}
		int cost=dijkstra(1,vex,v);
		System.out.println(cost);
	}
	public static int dijkstra(int start,Vex[] vex,int v){
		int lowcost=0;
		int[] visited=new int[v+1];
		int[] dist=new int[v+1];
		int[] cost=new int[v+1];
		for (int i = 1; i <=v; i++) {
			dist[i]=INT_MAX;
			cost[i]=INT_MAX;
		}
		dist[start]=0;
		cost[start]=0;
		Queue<Integer> queue=new ArrayDeque<>();
		queue.add(start);
		while (!queue.isEmpty()) {
			int node=queue.poll();
			while (visited[node]!=1) {
				visited[node]=1;
				for (Edge edge : vex[node].edges) {
					int to=edge.to;
					if (visited[to]==1) {
						continue;
					}
					int tempcost=edge.cost;
					int tempdist=dist[node]+tempcost;
					if (tempdist<dist[to]) {
						dist[to]=tempdist;
						cost[to]=tempcost;
						queue.add(to);
					}else if (tempdist==dist[to]) {
						if (tempcost<cost[to]) {
							cost[to]=tempcost;
						}
					}
				}				
			}		
		}
		for (int i = 2; i <=v; i++) {
			lowcost=lowcost+cost[i];
		}
		return lowcost;
	}
}
class Vex{
	List<Edge> edges;
	public Vex(){
		edges=new ArrayList<Edge>();
	}
}
class Edge{
	int to;
	int cost;
	public Edge(int t,int c){
		to=t;
		cost=c;
	}
}