1. 程式人生 > >floyd求最小環

floyd求最小環

int inf cst 而是 不知道 為什麽 class include con

hdu1599 floyd求最小環

其實floyd求最小環就相當於找出一個一條只包括1到k-1中節點的路徑,然後把這個路徑與k這個節點相連。這樣是正確的原因是,最小環中一定有一個最大節點k,當最外層節點是k時,我們一定會枚舉到k兩端的兩個節點,這樣就統計出了答案。至於為什麽不能直接用最短路徑,而是要用前k-1個節點跑出來的最短路徑,是因為不知道最短路徑有沒有經過k。

反正這個算法是對的就對了。

#include <cstdio>
#include <algorithm>
using namespace std;

const int maxn=105, INF=1e9;
int
n, m, minm, dis[maxn][maxn], ori[maxn][maxn]; int main(){ while (~scanf("%d%d", &n, &m)){ for (int i=1; i<=n; ++i) for (int j=1; j<=n; ++j){ dis[i][j]=dis[j][i]=INF; ori[i][j]=ori[j][i]=INF; } int x, y, v; minm=INF; for
(int i=1; i<=m; ++i){ scanf("%d%d%d", &x, &y, &v); ori[x][y]=ori[y][x]=min(ori[x][y], v); dis[x][y]=dis[y][x]=min(ori[x][y], v); } for (int k=1; k<=n; ++k){ for (int i=1; i<=n; ++i) for (int
j=1; j<=n; ++j) //三點都要不相同。ij不一定,但是相同的點ori一定是INF。 //所以只需要判斷i!=j。 if (i!=j&&dis[i][j]!=INF&&ori[j][k]!=INF &&ori[k][i]!=INF) minm=min(minm, dis[i][j]+ori[j][k]+ori[k][i]); for (int i=1; i<=n; ++i) for (int j=1; j<=n; ++j) dis[i][j]=min(dis[i][j], dis[i][k]+dis[k][j]); } if (minm==INF) printf("It's impossible.\n"); else printf("%d\n", minm); } }

floyd求最小環