上海交通大學復試題 最短路徑

2021-09-11 08:40:51 字數 1723 閱讀 6739

上海交通大學復試題 最短路徑

時間限制: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 4

1 22 3

1 30 1

複製

8

911

這道題看似是一道常見的最短路的題目,但是邊權非常大,如果要寫成高精度可能會非常麻煩。但是如果模擬一遍就可以發現一些有用的細節。

如果按照以下的順序讀入邊:

e1 e1

e2 e3

e3 e1

那麼是否這三條邊都是有用的呢?答案是否定的,因為第i行輸入邊權是2(i-1)由二進位制的知識可以知道,此前的所有邊權都加起來也不會超過這個權值,也就是說如果這兩個節點已經在此前構建的某乙個連通圖中,那麼當前輸入的邊權就一定可以捨去。那麼此時問題就退化成了構建乙個mst的問題。顯然此時使用並查集構建乙個mst,再套乙個dijkstra的殼就可以了。

#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...