牛客網機試題 最短路徑(並查集)

2021-10-05 16:42:31 字數 920 閱讀 7178

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

由於2^k可以非常大,如果單純最短路套模板,在比較路徑大小的地方就超範圍了。而2^k是有規律的

每次加入的路徑都比之前加入的所有路徑之和大1,那麼如果本來輸入兩端a,b。a與b已經連通了,那

就沒必要加入這條新路徑了,但如果a,b分別屬於兩個連通圖,那麼他們分別的點到對方的點必然會通

過新加入的路徑。所以就維護乙個連通圖各個點的最短距離,然後更新就可以了

#include #include #include using namespace std;

const int mod=1e5;

const int maxn=1e2;

int pra[maxn],rank[maxn],dis[maxn][maxn];

int finding(int num);

void init(int n);

int main()

}if(rank[fa]pra[fa]=fb;

else

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

}return 0;

}void init(int n)

int finding(int num)

hdu5361 最短路 並查集

題意 有n個點排成一排,編號從1到n,每個點可以到自己 l,r 距離的位置,花費c,問一號店到其他點的最小花費 pragma comment linker,stack 102400000,102400000 include include include include include includ...

並查集 牛客1080 B

tokitsukaze有n個數,需要按順序把他們插入雜湊表中,雜湊表的位置為0到n 1。插入的規則是 剛開始雜湊表是空的。對於乙個數x,在雜湊表中,如果 x mod n 的位置是空的,就把x放在 x mod n 的位置上。如果不是空的,就從 x mod n 往右開始找到第乙個空的位置插入。若一直到n...

HDU5361In Touch 最短路 並查集

題目描述 有n個傳送機排成一排,編號從1到n,每個傳送機都可以把自己位置的東西傳送到距離自己 l,r 距離的位置,並且花費c,問從1號傳送機到其他傳送機的最小花費是多少 思路 從第乙個點開始更新,更新過的點從未被更新的點中除去,因為在dijkstra裡 每次取出的都是最小的distance,所以更新...