很久以前,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最多花費的路費是多少。
樣例輸入1
51 2 2
1 3 1
2 4 5
2 5 4
樣例輸出1
135輸出格式
大臣j從城市4到城市5要花費135的路費。
一共有 n 個點,共 n - 1 條路線,且任意兩點之間有路線,無環,因此這是乙個樹,也是乙個無環無向圖。
因此就可以使用dfs或bfs進行搜尋,或用floyd演算法求多源點之間的最短路(將邊的權改為負)。
但是floyd演算法的時間複雜度很高 o(n^3),只能通過75%的資料,事實上,大約超過 300 個點之後都會執行超時,只是它的測試資料較弱罷了
首先是floyd演算法:
1/*2view code* 多源點之間的最短距離
3* 還忽略乙個問題, 那就是鄰接矩陣的大小 4*/
5 #include6 #include7 #include8
9using
namespace
std;
1011
const
int max_v = 1009;12
const
int inf =1e6;
1314
inte[max_v][max_v];
15int n = 0;16
17void print(int
a[max_v][max_v])
1823 cout<
;24} 25}
2627
intmain()
2835
else38}
39while(cin>>n)
4047
//print(e);
48//
floyd
49//
居然沒有 0 ......
50for(int k=1;k<=n;k++)
51for(int i=1;i<=n;i++)
52for(int j=1;j<=n;j++)
53//
非得逼我手算一次才能發現問題所在...(abs)
54if(abs(e[i][j]) > abs(e[i][k] +e[k][j]))
60//
print(e);
61 ret = -ret;
62int ans = (11 + (ret+10))*(ret)/2
;63 cout
64break;65
}6667return0;
68 }
接下來是深搜:
1/*2view code* 比較典型的圖或樹的搜尋
3* 這個圖比較稀疏, 鄰接表可能會好一點
4* 我們只要搜尋度為 1 的點就好, 它一定是起點或者終點
5* 因為如果度大於 1 的點是終點的話,一定可以繼續走下去
6- 後記 - :我沒想到怎樣避免不搜尋圖中遇到它...
7- 現在有想法了, 如果它是起點,那麼 dis = 0
8* 那麼它一定還可以繼續前進
9* -----------------------------------
10* 此外, 還可以用floyd演算法來求多源點之間的最短距離
11* 這裡的距離是求最長距離,所以賦予其負的權值就 ok
12*/
13 #include14 #include15 #include16 #include17
18using
namespace
std;
1920
const
int max_v = 10009; //
題目沒有說最大城市的數量
21int ret = -1; //
最大花費
22int dis = 0; //
當前走的距離
23bool
book[max_v];
24int s = 0;25
int km = 0;26
int loc = 0;27
28struct
edge;
3233 vectorg[max_v];
3435
//搜尋起點,從 1 開始找最遠的距離
36void finds(int a, int
km)3744}
45for(int i=0;i)51}
52}5354
//費用最大,即走的路程最多
55void dfs(int a, int
dis)56
61for(int i=0;i)67}
6869
return;70
}7172int
main()
7387 memset(book, true, sizeof
(book));
88 book[1] = false
;89 finds(1, 0
);90
//cout<
//cout<
(book));
93 book[loc] = false
;94 dfs(loc, 0
);95
//cout<
9899
return0;
100}
101/*
好像是錯誤的,通過的資料應該是巧合
102edge mx;
103mx.len = 0;
104int s = 0;
105for(int i=1;i<=n;i++)
111}
112}
113*/
深搜分兩次,第一次找起點,第二次找最長路徑。就像提示裡說的那樣......
大臣的旅費
問題描述 很久以前,t王國空前繁榮。為了更好地管理國家,王國修建了大量的快速路,用於連線首都和王國內的各大城市。為節省經費,t國的大臣們經過思考,制定了一套優秀的修建方案,使得任何乙個大城市都能從首都直接或者通過其他大城市間接到達。同時,如果不重複經過大城市,從首都到達每個大城市的方案都是唯一的。j...
大臣的旅費
很久以前,t王國空前繁榮。為了更好地管理國家,王國修建了大量的快速路,用於連線首都和王國內的各大城市。為節省經費,t國的大臣們經過思考,制定了一套優秀的修建方案,使得任何乙個大城市都能從首都直接或者通過其他大城市間接到達。同時,如果不重複經過大城市,從首都到達每個大城市的方案都是唯一的。j是t國重要...
藍橋 大臣的旅費
問題描述 很久以前,t王國空前繁榮。為了更好地管理國家,王國修建了大量的快速路,用於連線首都和王國內的各大城市。為節省經費,t國的大臣們經過思考,制定了一套優秀的修建方案,使得任何乙個大城市都能從首都直接或者通過其他大城市間接到達。同時,如果不重複經過大城市,從首都到達每個大城市的方案都是唯一的。j...