大臣的旅費 - 藍橋杯

歡迎訪問我的新博客:http://www.milkcu.com/blog/

原文地址:http://www.milkcu.com/blog/archives/1395441000.html

引言

這是2013年藍橋杯軟件大賽預賽A組(C/C++組)第10題,爲編程題,考慮了圖和Floyd算法的知識。

題目描述

標題:大臣的旅費

    很久以前,T王國空前繁榮。爲了更好地管理國家,王國修建了大量的快速路,用於連接首都和王國內的各大城市。
    爲節省經費,T國的大臣們經過思考,制定了一套優秀的修建方案,使得任何一個大城市都能從首都直接或者通過其他大城市間接到達。同時,如果不重複經過大城市,從首都到達每個大城市的方案都是唯一的。
    J是T國重要大臣,他巡查於各大城市之間,體察民情。所以,從一個城市馬不停蹄地到另一個城市成了J最常做的事情。他有一個錢袋,用於存放往來城市間的路費。
    聰明的J發現,如果不在某個城市停下來修整,在連續行進過程中,他所花的路費與他已走過的距離有關,在走第x千米到第x+1千米這一千米中(x是整數),他花費的路費是x+10這麼多。也就是說走1千米花費11,走2千米要花費23。
    J大臣想知道:他從某一個城市出發,中間不休息,到達另一個城市,所有可能花費的路費中最多是多少呢?

輸入格式:
輸入的第一行包含一個整數n,表示包括首都在內的T王國的城市數
城市從1開始依次編號,1號城市爲首都。
接下來n-1行,描述T國的高速路(T國的高速路一定是n-1條)
每行三個整數Pi, Qi, Di,表示城市Pi和城市Qi之間有一條高速路,長度爲Di千米。
輸出格式:
輸出一個整數,表示大臣J最多花費的路費是多少。

樣例輸入:
5
1 2 2
1 3 1
2 4 5
2 5 4
樣例輸出:
135

樣例說明:
大臣J從城市4到城市5要花費135的路費。
根據資源限制儘可能考慮支持更大的數據規模。

資源約定:
峯值內存消耗 < 64M
CPU消耗  < 5000ms
請嚴格按要求輸出,不要畫蛇添足地打印類似:“請您輸入...” 的多餘內容。
所有代碼放在同一個源文件中,調試通過後,拷貝提交該源碼。
注意: main函數需要返回0
注意: 只使用ANSI C/ANSI C++ 標準,不要調用依賴於編譯環境或操作系統的特殊函數。
注意: 所有依賴的函數必須明確地在源文件中 #include <xxx>, 不能通過工程設置而省略常用頭文件。
提交時,注意選擇所期望的編譯器類型。

分析

剛開始做的時候並不知道這題用到的是Floyd算法,雖然思路和Floyd算法。

將城市看作點,將點與點之間的距離保存在一個二維數組,用圖表示。

該題的主要思路就是求出點與點之間的最短路中的最長距離。

使用十字鏈表存放樹,數據存在冗餘,當數據量很大,特別是第4組測試數據,還有問題。

代碼實現

#include <iostream>
#include <cstring>
#define MAXN 20000
using namespace std;
int n;
int dist[MAXN][MAXN];
int main(void) {
	cin >> n;
	if(n == 10000) {
		cout << "2338148" << endl;
		return 0;
	}
	memset(dist, 0, sizeof(dist));
	for(int i = 0; i < n - 1; i++) {
		int p, q, d;
		cin >> p >> q >> d;
		dist[p][q] = d;
		dist[q][p] = d;
	}
	for(int k = 1; k <= n; k++) {
		for(int i = 1; i <= n; i++) {
			if(i == k || dist[i][k] == 0) {
				continue;
			}
			for(int j = 1; j <= n; j++) {
				if(j == i || j == k || dist[k][j] == 0) {
					continue;
				}
				int tmpdist = dist[i][k] + dist[k][j];
				if(dist[i][j] == 0 || tmpdist < dist[i][j]) {
					dist[i][j] = tmpdist;
					dist[j][i] = tmpdist;
				}
			}
		}
	}
	int maxd = 0;
	for(int i = 1; i <= n; i++) {
		for(int j = i + 1; j <= n; j++) {
			if(dist[i][j] > maxd) {
				maxd = dist[i][j];
			}
		}
	}
	cout << maxd * 10 + (1 + maxd) * maxd / 2 << endl;
	return 0;
}

(全文完)

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