上海交通大學復試題 最短路徑
時間限制:1秒
空間限制:65536k
熱度指數:3277
n個城市,標號從0到n-1,m條道路,第k條道路(k從0開始)的長度為2^k,求編號為0的城市到其他城市的最短距離
第一行兩個正整數n(2<=n<=100)m(m<=500),表示有n個城市,m條道路接下來m行兩個整數,表示相連的兩個城市的編號
n-1行,表示0號城市到其他城市的最短路,如果無法到達,輸出-1,數值太大的以mod 100000 的結果輸出。示例1
複製
4 41 22 3
1 30 1
複製
8911
這道題看似是一道常見的最短路的題目,但是邊權非常大,如果要寫成高精度可能會非常麻煩。但是如果模擬一遍就可以發現一些有用的細節。
如果按照以下的順序讀入邊:
e1 e1那麼是否這三條邊都是有用的呢?答案是否定的,因為第i行輸入邊權是2(i-1)由二進位制的知識可以知道,此前的所有邊權都加起來也不會超過這個權值,也就是說如果這兩個節點已經在此前構建的某乙個連通圖中,那麼當前輸入的邊權就一定可以捨去。那麼此時問題就退化成了構建乙個mst的問題。顯然此時使用並查集構建乙個mst,再套乙個dijkstra的殼就可以了。e2 e3
e3 e1
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace std;
typedef
long
long ll;
const ll inf =
1061109567
;const
int maxn =
102;
const ll mod =
100000
;ll fpow
(ll base,
int exp)
return ans;
}int root[maxn]
;ll mat[maxn]
[maxn]
;int
find_root
(int x)
intmain
(int argc,
char
const
*ar**)
mat[i]
[i]=0;
}int a,b;
ll w;
for(
int i=
0;i/*for(int i=0;iint s[maxn]
; ll dis[maxn]
;for
(int i=
0;i) s[0]
=1;for
(int i=
1;i) s[u]=1
;for
(int j=
0;j}for
(int i=
1;ireturn0;
}
考研機試真題 最短路徑 上海交通大學
關鍵字 求最短路徑 但是距離為高精度數 處理起來太複雜 根據給的距離的規律 2 k 用最小生成樹的解法 題目 n個城市,標號從0到n 1,m條道路,第k條道路 k從0開始 的長度為2 k,求編號為0的城市到其他城市的最短距離 輸入描述 第一行兩個正整數n 2 n 100 m m 500 表示有n個城...
上海交通大學計算機研究生復試題 回文數
問題 c 回文數 時間限制 1 sec 記憶體限制 128 mb 題目描述 若乙個數 首位不為零 從左向右讀與從右向左讀都一樣,我們就將其稱之為回文數。例如 給定乙個10進製數56,將56加65 即把56從右向左讀 得到121是乙個回文數。又如 對於10進製數87 step1 87 78 165 s...
中南大學複試上機 最短路徑
題目描述 小王和小明是好朋友,兩人最開始各有乙個初始位置 p 和乙個恆定速度 v,從0時刻起開始,他們從初始位置以恆定速度開始行走,請告訴我行走過程中兩人的最短距離是多少。輸入第一行輸入t代表測試樣例數目。對於每個樣例,第一行包含四個整數 x1,y1,x2,y2,表示人的起點 x1,y1 x2,y2...