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條交通路徑,每條交通路徑都是單行道。他已經預先規劃好了一些點作為旅遊的起點和終點,他想選擇其中乙個起點和乙個終點...