1956 Problem C 最短路徑

2021-08-24 20:55:27 字數 1172 閱讀 3504

時間限制: 1 sec  記憶體限制: 32 mb

提交: 169  解決: 29

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 的結果輸出。

4 3

0 11 2

2 0

1

3-1

這一題......顯然有坑吶!第k條道路長度為2^k,第32條開始就超過整型的表示範圍了!所以,這題需要用一定的技巧。

第乙個技巧是快速冪,這個寫乙個小函式就能實現了,用於對大型指數取模運算。

第二個,就是你要看到這個題目,是有規律的,每條依次出現的道路,後面的道路必然大於前面出現的所有道路的和,

即2^1+2^2+.......+2^(n-1)=(2^n) - 1< 2^n  所以,後面輸入的邊需要進行判斷:

1   如果這兩個端點已經連通了,那麼這個輸入的邊必然大於原來連通的距離,所以不需要更新

2   如果這兩個端點仍沒有任何路徑可達,就更新這兩個端點所有可達點的路徑,這兩個端點將併入乙個連通圖中。

綜上所述,這一題需要結合並查集和快速冪,即可正確執行~~

#include #include #include using namespace std;

const int maxn=110;

const int inf=-1;

int father[maxn],d[maxn][maxn];

int n;

int quickpow(int a,int b,int m)

x=x*x%m;

b=b>>1;

} return ans;

}void init(int n)

}int findfather(int a)

int main()}}

}}

father[y]=x;

} for(int i=1;iprintf("%d\n",d[0][i]);

} return 0;

}

1956 Problem C 最短路徑

時間限制 1 sec 記憶體限制 32 mb 提交 330 解決 55 提交 狀態 討論版 命題人 外部匯入 n個城市,標號從0到n 1,m條道路,第k條道路 k從0開始 的長度為2 k,求編號為0的城市到其他城市的最短距離。第一行兩個正整數n 2 n 100 m m 500 表示有n個城市,m條道...

最短路 最短路徑問題

題目描述 平面上有n個點 n 100 每個點的座標均在 10000 10000之間。其中的一些點之間有連線。若有連線,則表示可從乙個點到達另乙個點,即兩點間有通路,通路的距離為兩點直線的距離。現在的任務是找出從一點到另一點之間的最短路徑。input 共有n m 3行,其中 第一行為乙個整數n。第2行...

最短路徑演算法 最短路

在每年的校賽裡,所有進入決賽的同學都會獲得一件很漂亮的t shirt。但是每當我們的工作人員把上百件的衣服從商店運回到賽場的時候,卻是非常累的!所以現在他們想要尋找最短的從商店到賽場的路線,你可以幫助他們嗎?input 輸入包括多組資料。每組資料第一行是兩個整數n m n 100,m 10000 n...