弗洛伊德算法模板
阿新 • • 發佈:2018-10-03
class splay data- pre i++ gree 代碼 printf cst
可以求得任意兩點之間的最短路問題
1 int d[maxn][maxn];//d[st][en]表示邊e = {u,v}的權值(不存在時設為INF,d[i][j] = 0) 2 int V;//頂點的個數 3 4 void Floyd() 5 { 6 for(int k = 0; k < V; k++) 7 for(int i = 0; i < V; i++) 8 for(int j = 0; j < V; j++) 9 { 10 d[i][j] = min(d[i][k] + d[k][j],d[i][j]);11 } 12 }
對於Floyd算法紫書上給出了這樣的提示:
如果使用Floyd算法,在定義INF的大小的時候要註意這個潛在的問題:INF不能定義的太大(如2000000000),否則d[i][k] + d[k][j]會溢出,但是如果INF定義的過小,可能會讓長度為INF的邊成為最短路的一部分,所以最好估計一下最短路的上限,將INF定義為比這個上限大一點點的數。例如:有1000條邊,每條邊為1000,那麽可以將INF定義為1000001。
附練習題一道:Six Degrees of Cowvin Bacon
題意:有N頭牛要拍電影,如果兩頭牛共拍過一部電影,這兩頭牛之間的距離就是1,如果這兩頭牛都與第三頭牛一起拍過電影,這兩頭牛之間距離就是2,問一頭牛與其他牛之間的距離的最小平均值,將它乘以100輸出。(註意要先乘以100 再除:因為int會讓除的時候的精度損失,如果先除再乘以100會將誤差放大)
代碼:
1 #include <iostream> 2 #include <algorithm> 3 #include <queue> 4 #include <stack> 5 #include <cstdio> 6 #include <string> 7 #include <cstring> 8 #include <sstream> 9 #include <cmath> 10 #define INF 0x3f3f3f3f 11 #define mod 1000000007; 12 #defineView CodeFRE() freopen("in.txt","r",stdin) 13 using namespace std; 14 const int maxn = 305; 15 int n,m,ans; 16 int cow[maxn][maxn],temp[maxn]; 17 18 void Floyd() 19 { 20 for(int k = 1; k <= n; k++) 21 for(int i = 1; i <= n; i++) 22 for(int j = 1; j <= n; j++) 23 { 24 cow[i][j] = min(cow[i][j],cow[i][k] + cow[k][j]); 25 } 26 } 27 28 29 30 int main() 31 { 32 //FRE(); 33 while(scanf("%d%d",&n,&m) != EOF) 34 { 35 memset(cow,INF,sizeof(cow)); 36 for(int j = 0; j < maxn; j++) 37 { 38 cow[j][j] = 0; 39 } 40 int t; 41 while(m--) 42 { 43 scanf("%d",&t); 44 for(int i = 0; i < t; i++) 45 { 46 scanf("%d",&temp[i]); 47 } 48 for(int i = 0; i < t; i++) 49 for(int j = i+1; j < t; j++) 50 { 51 int x = temp[i],y = temp[j]; 52 cow[x][y] = 1; 53 cow[y][x] = 1; 54 } 55 } 56 Floyd(); 57 ans = INF; 58 for(int i = 1; i <= n; i++) 59 { 60 int res = 0; 61 for(int j = 1; j <= n; j++) 62 { 63 res += cow[i][j]; 64 } 65 ans = min(ans, res*100/(n-1)); 66 } 67 printf("%d\n",ans); 68 } 69 return 0; 70 }
弗洛伊德算法模板