Ural 1004 FLOYD最小環問題

2022-05-29 04:54:10 字數 1500 閱讀 9289

題目大意: 給出一些雙向邊, 求圖中的乙個最小環, 當u-v被選中時, v-u不能被選, 按順序輸出這個最小環, n<=100

無解則輸出。

題目既然要求最小環,資料範圍還這麼小, 容易聯想到floyd, 並且這裡是雙向邊也沒有什麼關係, 因為只能選一條, 但題目比較麻煩的地方就是要輸出這個環,

我的處理好像和機房的人不一樣。。。。。

我想到的辦法是對於每乙個i -> j的路徑, 記下最優的中間點, 再記下最小環中的最大序號點, 和最小環中的floyd的那一條路徑的起點和終點, 遞迴輸出。

開始一直wa#2, 一開始以為是我的floyd和網上主流的floyd不一樣, 然而好像我的floyd那個細節地方貌似無關緊要, 然後突然發現有個bug!!!! 因為我的最小環記下的路徑是前k-1個點為中間點更新後的答案, 所以一種詭異的情況就是第k次恰好可以更新掉我記下的路徑, 那麼我輸出的答案會有兩個k點(手動滑稽。。。。)所以我就做了兩遍, 先做出最小環再跑一遍floyd就ok

好像還可以用個vector來更新答案, 不過沒我的方便hhhh

貼**-----

#include 

#include

const

int n = 100 + 10;

const

int oo = 1e8 + 1e7 + 7e5;

#define min(a, b) a < b? a : b

#define rep(i, s, t) for(int i = s; i <= t; ++i)

int g[n][n], p[n], mid, x, y, top;

int n, m, a[n][n], f[n][n], ans[n];

void init()

void dfs(int i, int j)

dfs(i, g[i][j]), dfs(g[i][j], j);

}int main()

rep(i, 0, n) a[i][i] = f[i][i] = 0;

int res = oo;

rep(k, 1, n)

}if(res >= oo)

bool flag = 0;

rep(i, 1, n) rep(j, 1, n) f[i][j] = a[i][j], g[i][j] = 0;

rep(k, 1, n)

if(flag) break;

}if(flag) break;

rep(i, 1, n)

rep(j, 1, n)

if(f[i][k] + f[k][j] < f[i][j])

}p[mid] = 1, ans[++top] = mid;

dfs(x, y);

rep(i, 1, top) printf("%d%c", ans[i], i^top? ' ':'\n');

}return

0;}

看起來很長吧, 其實思路很清晰的。。。。。相信你們也不會來看我的這麼醜的**

ural 1004(floyd 求最小環)

poj暫時出問題。就先做乙個這裡的題了。簡單題。求無向圖的最小環。floyd演算法。include include includeusing namespace std const int inf 100000000 int maze 110 110 dis 110 110 path 110 pi ...

timus1004 最小環 Floyd 演算法

通過別人的資料搞了好久才成功,果然還是不夠成熟 做題目還是演算法不能融會貫通 大意即找出圖中至少3個頂點的環,且將環中點按順序輸出 用floyd演算法求最小環 因為floyd演算法求最短路徑是通過中間量k的增加而更新的 演算法流程 對於k,我們知道利用floyd演算法求出任意兩點i,j最短距離,僅通...

floyd求最小環

floyd求最小環 1 定義 通常來說最小環是針對有向圖而言 從乙個點出發,經過一條簡單路徑回到起點成為環.圖的最小環就是所有環中長度最小的.2.怎樣求最小環呢?的解決方法 dijkstra 任意乙個環的權值,我們都可以看成兩個有邊相連的結點i j的直接距離加上i j間不包含邊 邊i j 的最短路徑...