多源對多源最短路徑

2021-10-07 12:09:26 字數 1600 閱讀 6749

魔方國有n座城市,編號為1\sim n1∼n。城市之間通過n-1條無向道路連線,形成乙個樹形結構。

在若干年之後,其中p座城市發展成了大都會,道路的數量也增加到了m條。

大都會之間經常有**往來,因此,對於每座大都會,請你求出它到離它最近的其它大都會的距離。

蒟蒻第一次見多源對多源最短路,沒想到是這種處理方式。

第一步就是按照正常加乙個虛點連線所有的大都會,距離為0然後跑一邊dijkstra , 同時記錄當前這個點距離哪個大都會最近。

當前u點最近的大都會from[u] , v點最近的大都會from[v] ,

如果他們from[u] = from[v] , 那也就是u 和 v兩點由同乙個點拓展而出 , 否則的話由兩個點拓展而出的時候,就可以算一下這兩個拓展點之間的最短距離 ,,

那麼其中乙個大都會距離另乙個大都會的最短距離可更新為ans = min(ans , dis[u] + dis[v] + w )

#include #include #include #include #include #include #include #include #include #include #include #include #include #include #pragma gcc optimize(3 , "ofast" , "inline")

using namespace std ;

#define ios ios::sync_with_stdio(false) , cin.tie(0) , cout.tie(0)

#define x first

#define y second

typedef long long ll ;

const double esp = 1e-6 , pi = acos(-1) ;

typedef pairpii ;

const int n = 1e6 + 10 , inf = 0x3f3f3f3f , mod = 1e9 + 7;

ll in()

while(isdigit(ch)) x = x * 10 + ch - 48 , ch = getchar() ;

return x * f ;

}int e[n] , ne[n] , h[n] , n , m , p , idx , a[n] , vis[n] , from[n] ;

ll dis[n] , ans[n] , w[n] ;

void add(int a , int b , int c)

int main()

) , dis[a[i]] = 0 , from[a[i]] = a[i] ;

while(q.size())

) ;else if(from[v] != from[u])

}} for(int i = 1; i <= p ;i ++ ) cout << ans[a[i]] << " " ;

puts("") ;

return 0 ;}/*

*/

多源最短路徑

可以簡單的通過執行 v 次單源最短路徑演算法來解決,每次使用乙個不同的結點作為源結點 多數演算法採用鄰接矩陣來表示圖,因此 演算法的輸入為乙個n n的矩陣w,代表乙個有n個結點的有向圖g v,e 的邊的權重 wij 0 若i j 權重 若i j,且 i,j 屬於e inf 若i j,且 i,j 不屬...

多源最短路徑問題

problem description tonyy是乙個喜歡到處浪的男人,他的夢想是帶著蘭蘭姐姐浪遍 的各個角落,不過在此之前,他需要做好規劃。現在他的手上有乙份 地圖,上面有n個城市,m條交通路徑,每條交通路徑都是單行道。他已經預先規劃好了一些點作為旅遊的起點和終點,他想選擇其中乙個起點和乙個終點...

多源最短路

題目描述 已知n個點 n 100 給你n n的方陣,a i,j 表示從第i個點到第j個點的直接距離。現在有q個詢問,每個詢問兩個正整數,a和b,讓你求a到b之間的最短路程。滿足a i,j a j,i 輸入描述 第一行乙個正整數n,接下來n行每行n個正整數,滿足a i,i 0,再一行乙個q,接下來q行...