多源最短路徑Floyd Floyd求最小環 模板

2021-07-02 13:36:47 字數 1565 閱讀 3023

floyd演算法:用來找出每對點之間的最短距離。圖可以是無向圖,也可以是有向圖,邊權可為正,也可以為負,唯一要求是不能有負環。 

1.初始化:將map中的資料複製到dist中作為每對頂點之間的最短路徑的初值,pre[i][j] = i 表示 i 到 j 路徑中 j 的前一節點。 

2. k 從 1 到 n 迴圈 n 次,每次迴圈中,列舉圖中不同的兩點 i,j,如果dist[i][j] > dist[i][k] + dist[k][j],則更新dist[i][j] = dist[i][k] + dist[k][j],更新pre[i][j] = pre[k][j]。 

只要圖中不存在負環就可以得出正確的答案,關於floyd演算法對負環的判定,參考下邊floyd求最小環。

const int maxn = 110;

const int inf = 0xffffff0;

int map[maxn][maxn], dist[maxn][maxn],pre[maxn][maxn];

//pre[i][j] = i表示i到j路徑中j的前一節點

void floyd(int n)

}for(int k = 1; k <= n; ++k)

}}}}

如果求點u到點v能達到的最長邊盡可能短的路徑上最長邊為多少,將迴圈內部改為如下**:

int tmax;   //這裡邊求的是能達到的路徑上最長邊最小為多少  

if(dist[i][k] > dist[k][j])

tmax = dist[i][k];

else

tmax = dist[k][j];

if(dist[i][j] > tmax)

dist[i][j] = tmax;

floyd求最小環 

不能在map陣列上直接計算,因為判斷過程中用到了map原始值。

const

int maxn = 110;

const

int inf = 0xffffff0;

int temp,map[maxn][maxn],dist[maxn][maxn],pre[maxn][maxn],ans[maxn*3];

void solve(int i,int j,int k)

ans[temp++] = i;

ans[temp++] = k;

}void floyd(int n)

int mincircle = inf; //最小環

for(int k = 1; k <= n; ++k)}}

for(int i = 1; i <= n; ++i)}}

}if(mincircle == inf) //不存在環

//如果求出最小環為負的,原圖必定存在負環

for(int i = 0;i < temp; ++i) //輸出最小環

if(i != temp-1)

printf("%d ",ans[i]);

else

printf("%d\n",ans[i]);

}

多源最短路徑

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

多源對多源最短路徑

魔方國有n座城市,編號為1 sim n1 n。城市之間通過n 1條無向道路連線,形成乙個樹形結構。在若干年之後,其中p座城市發展成了大都會,道路的數量也增加到了m條。大都會之間經常有 往來,因此,對於每座大都會,請你求出它到離它最近的其它大都會的距離。蒟蒻第一次見多源對多源最短路,沒想到是這種處理方...

多源最短路徑問題

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