floyd求最小環
阿新 • • 發佈:2017-11-27
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求最小環