1. 程式人生 > >CCF CSP 201609-4 交通規劃(java)

CCF CSP 201609-4 交通規劃(java)

試題編號:201609-4
試題名稱:交通規劃
時間限制:1.0s
記憶體限制:256.0MB
問題描述:問題描述  G國國王來中國參觀後,被中國的高速鐵路深深的震撼,決定為自己的國家也建設一個高速鐵路系統。
  建設高速鐵路投入非常大,為了節約建設成本,G國國王決定不新建鐵路,而是將已有的鐵路改造成高速鐵路。現在,請你為G國國王提供一個方案,將現有的一部分鐵路改造成高速鐵路,使得任何兩個城市間都可以通過高速鐵路到達,而且從所有城市乘坐高速鐵路到首都的最短路程和原來一樣長。請你告訴G國國王在這些條件下最少要改造多長的鐵路。
輸入格式  輸入的第一行包含兩個整數n, m,分別表示G國城市的數量和城市間鐵路的數量。所有的城市由1到n編號,首都為1號。
  接下來m行,每行三個整數a, b, c,表示城市a和城市b之間有一條長度為c的雙向鐵路。這條鐵路不會經過a和b以外的城市。
輸出格式  輸出一行,表示在滿足條件的情況下最少要改造的鐵路長度。
樣例輸入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 ≤ a, b ≤ n,1 ≤ c ≤ 1000。輸入保證每個城市都可以通過鐵路達到

解題思路:http://blog.csdn.net/tigerisland45/article/details/60084015

大佬的部落格寫得很清楚了,我不會c++,大致能看懂大佬用c++寫的,所以這篇應該不屬於原創吧,只是把大佬的程式碼用java翻譯了一遍,但是如果只翻譯的話還不能達到完美,因為只翻譯的話,會超時,只有90分,我又仔細研究了一遍,發現大佬的程式碼有個小缺陷就是,當然用c++寫的,時間足夠了。下面我就說一說小缺陷在哪,從下圖開始


從圖中1開始,訪問相鄰的2、3,同時把1標記為已經訪問過的點,那麼從佇列中推出2時,又把2相鄰的1、3、4節點都訪問了,其實1這個節點已經被標記過為訪問過的點,就不需要再訪問了,意思就是已被訪問多的點就不需要出現在迴圈中了。改進的程式碼就是87、88行,當然還需要在Edge類中重寫equals方法。

完整程式碼如下:

/*
 * 
 * 
 * 
6 9
1 2 6
1 3 3
2 3 2
2 4 5
3 4 3 
3 5 4
4 5 2
4 6 3
5 6 5
*
*
4 5 
1 2 4 
1 3 5 
2 3 2 
2 4 3 
3 4 2
 */
import java.util.ArrayList;
import java.util.PriorityQueue;
import java.util.Queue;
import java.util.Scanner;

public class _11 {
	static ArrayList<Edge>[] map;
	static Queue<Node> q;
	//static ArrayList<Edge> out;
	static boolean[] vis;
	static int[]  dis;
	static int[]  cost;
	static int n;
	public static void main(String[] args)
	{
		Scanner sin=new Scanner(System.in);
		n=sin.nextInt();
		int m=sin.nextInt();
		map=new ArrayList[n+1];
		q=new PriorityQueue();
		vis=new boolean[n+1];
		dis=new int[n+1];
		cost=new int[n+1];
		for(int i=0;i<=n;i++)
		{
			map[i]=new ArrayList();
			dis[i]=0x3f3f3f;
		}
		for(int j=0;j<m;j++)
		{
		  int start=sin.nextInt();
		  int end=sin.nextInt();
		  int weight=sin.nextInt();
		  map[start].add(new Edge(end,weight));
		  map[end].add(new Edge(start,weight));
		}
		Dijkstra(1);
		int sum=0;
        for(int k=2;k<=n;k++)
        {
        	sum+=cost[k];
        }
        System.out.println(sum);
		// TODO Auto-generated method stub

	}
	static void Dijkstra(int start)
	{

		vis[0]=true;
		//vis[start]=true;
		q.offer(new Node(start,0));
		while(!q.isEmpty())
		{
			Node tmp=q.poll();
			if(!vis[tmp.end])
			{
				vis[tmp.end]=true;
				for(int j=0;j<map[tmp.end].size();j++)
				{
	                int weight=tmp.weight+map[tmp.end].get(j).weight;
	                int end=map[tmp.end].get(j).end;
	                int co=map[tmp.end].get(j).weight;
	                Edge e=new Edge(tmp.end,co);
	                map[end].remove(e);
	                if(weight<dis[end])
	                {
	                	dis[end]=weight;
	                	cost[end]=weight;
	                	q.offer(new Node(end,dis[end]));
	                }
	                if(weight==dis[end])
	                {
	                	cost[end]=Math.min(cost[end],co);
	                }
				}
			}

		}
		
		 
	}
	static class Node implements Comparable
	{
		int end;
		int weight;
		Node(int end,int weight)
		{
			this.end=end;
			this.weight=weight;
		}
		@Override
		public int compareTo(Object arg0) {
			// TODO Auto-generated method stub
			return this.weight-((Node)arg0).weight;
		}
	}
	static class Edge
	{
		int end;
		int weight;
		Edge(int end,int weight)
		{
			this.end=end;
			this.weight=weight;
		}
		@Override
		public boolean equals(Object obj) 
		{
			Edge other=(Edge)obj;
            if(this.end==other.end&&this.weight==other.weight)

		{
           return true; 	
		}
            return false;
		}
		
	}

}

修改之後還是有效果的:


最後說一句,我無fuck說,為了驗證自己的想法是正確,我又測試了一下,發現不改進也是能得滿分,這系統我無fuck說,結果如下:


相關推薦

CCF CSP 201609-4 交通規劃(java)

試題編號:201609-4試題名稱:交通規劃時間限制:1.0s記憶體限制:256.0MB問題描述:問題描述  G國國王來中國參觀後,被中國的高速鐵路深深的震撼,決定為自己的國家也建設一個高速鐵路系統。  建設高速鐵路投入非常大,為了節約建設成本,G國國王決定不新建鐵路,而是將

CCF-201609-4-交通規劃

這題照樣套模板,但是有個地方要修改。 題目意思是:求最短路徑的同時還要保證這些路徑的總權值最小 在兩條總權值相等的路徑中,經過結點最多的那個最好。你想想,如果我能從原來已有的結點上再加一條到達目標。是不是好過從上一個結點再拉一條呢。兩條總權值相等,結點數相等的路徑,最後一條邊權值越小

CCF 201609-4 交通規劃 (迪傑斯特拉+優先佇列)

這道題我沒有好的思路,剛開始用的是spfa打的,結果不行。 之前沒見過迪傑斯特拉+佇列優化。 但這確實挺好用,。要是最小生成樹跟最短路結合起來的話用這個跑最好不過了。 所以對這道題非常適用。 #include<bits/stdc++.h> using n

CCF 201609-4 交通規劃_最短路

CCF 201609-4 交通規劃 傳送門 先放張圖得瑟得瑟, 一遍過, so happy. 這是一道描述非常簡單的題目, 看到題目就有點小開心, 覺得肯定能做出來的. 目的很清晰, 所有的點到首都的距離都是最短路, 那麼最短路就要儲存下來捨棄其他無用

ccf 201609-4 交通規劃

dij最短路徑 #include<iostream> #include<vector> using namespace std; class edg{ public:

CCF習題 201612-4 交通規劃 (Dijkstra + 貪心)

大體題意: 題意不說了 中文的= = 思路: 既然要求到1的最短距離要存在,我們先用dijkstra演算法求出每一個點到1位置的最短距離,然後在看要哪一些邊! 既然要求路最短 並且包括最短距離,那麼我們可以列舉每一條邊{u,v,w}當這條路就是v到1位置的最短路之一時,我們

CCF-CSP201609-4 交通規劃(Dijkstra+優先佇列)

題目連結 問題描述 試題編號: 201609-4 試題名稱: 交通規劃 時間限制: 1.0s 記憶體限制: 256.0MB 問題描述: 問題描述   G國國王來中國參觀後,被中國的高速鐵路深深的震撼,決定為自己

CCF201609-4 交通規劃

一個 連接 最小 min cout logs ems 是否 namespace 問題描述   G國國王來中國參觀後,被中國的高速鐵路深深的震撼,決定為自己的國家也建設一個高速鐵路系統。  建設高速鐵路投入非常大,為了節約建設成本,G國國王決定不新建鐵路,而是將已有的鐵路改造

CCF-CSP -201612-2 工資計算 java 實現

CCFCSP的1-2題很簡單。但是這裡又在很簡單的問題上翻船了。這裡記錄一下吧! 試題 試題編號: 201612-2 試題名稱: 工資計算 時間限制: 1.0s 記憶體限制: 256.0MB 問題描述:   小明的公司每個月給小明發工資,而小明拿到的工資為交完個

ccf201609-4交通規劃

試題編號: 201609-4 試題名稱: 交通規劃 時間限制: 1.0s 記憶體限制: 256.0MB 問題描述: 問題描述   G國國王來中國參觀後,被中國的高速鐵路深深的震撼,決定為自己的國家也建設一個高速鐵路

ccf csp 201609-2 火車購票

問題描述   請實現一個鐵路購票系統的簡單座位分配演算法,來處理一節車廂的座位分配。   假設一節車廂有20排、每一排5個座位。為方便起見,我們用1到100來給所有的座位編號,第一排是1到5號,第二排是6到10號,依次類推,第20排是96到100號。   購票時,一個人可能

ccf-csp 201312-2 ISBN號碼 java

問題描述 試題編號: 201312-2 試題名稱: ISBN號碼 時間限制: 1.0s 記憶體限制: 256.0MB 問題描述: 問題描述   每一本正式出版的圖書都有一個ISBN號碼與之對應,ISBN碼包括9位

CCF-CSP模擬試題 打醬油 JAVA

問題描述 試題編號: 201709-1 試題名稱: 打醬油 時間限制: 1.0s 記憶體限制: 256.0MB 問題描述: 問題描述   小明帶著N元錢去買醬油。醬油10塊錢一瓶,商家進行促銷,每買3瓶送1瓶,或

CCF CSP 201604-4 遊戲

解題思路:學過搜尋的一眼就能看出是廣搜,沒學過建議翻翻書,畢竟考得挺多。注意事項: 1.廣搜用佇列來實現,也可用陣列迴圈來實現。 2.需要優化,不然會出現超時。 3.通關最長時間不超過300秒。 4.可

CCF201609-4 交通規劃(100分)

試題編號: 201609-4 試題名稱: 交通規劃 時間限制: 1.0s 記憶體限制: 256.0MB 問題描述: 問題描述   G國國王來中國參觀後,被中國的高速鐵路深深的震撼,決定為自己的國家也建設一個高速鐵路系統。   建設高速鐵路投入非常大,

CCF-CSP-201803-4 棋局評估

問題描述 試題編號: 201803-4 試題名稱: 棋局評估 時間限制: 1.0s 記憶體限制: 256.0MB 問題描述: 問題描述   Alice和Bob正在玩井字棋遊戲。   井字棋遊戲的規則很簡單:

CCF CSP 201609-1 最大波動

問題描述 小明正在利用股票的波動程度來研究股票。小明拿到了一隻股票每天收盤時的價格,他想知道,這隻股票連續幾天的最大波動值是多少,即在這幾天中某天收盤價格與前一天收盤價格之差的絕對值最大是多少。 輸入

CCF CSP 201712-2 遊戲 (java

  有n個小朋友圍成一圈玩遊戲,小朋友從1至n編號,2號小朋友坐在1號小朋友的順時針方向,3號小朋友坐在2號小朋友的順時針方向,……,1號小朋友坐在n號小朋友的順時針方向。  遊戲開始,從1號小朋友開始順時針報數,接下來每個小朋友的報數是上一個小朋友報的數加1。若一個小朋友報的數為k的倍數或其末位數(即數的個

CCF-CSP 201612-4壓縮編碼解題報告

CCF-CSP 201612-4壓縮編碼 標籤(空格分隔): CCF-CSP 1、問題描述 傳送門 2、題解 (1)引——石子合併問題 題目描述:在一個操場上擺放著一行共n

地鐵修建——CCF CSP 201703-4

試題編號: 201703-4 試題名稱: 地鐵修建 時間限制: 1.0s 記憶體限制: 256.0MB 問題描述   A市有n個交通樞紐,其中1號和n號非常重要,為了加強運輸能力,A市決定在1號到