弗洛伊德算法:算法
大意:數組
直接利用for循環鏈接距離並篩選最短的,簡單粗暴spa
例題:ip
Descriptionstring
在每一年的校賽裏,全部進入決賽的同窗都會得到一件很漂亮的t-shirt。可是每當咱們的工做人員把上百件的衣服從商店運回到賽場的時候,倒是很是累的!因此如今他們想要尋找最短的從商店到賽場的路線,你能夠幫助他們嗎?io
Inputfor循環
輸入包括多組數據。每組數據第一行是兩個整數N、M(N<=100,M<=10000),N表示成都的大街上有幾個路口,標號爲1的路口是商店所在地,標號爲N的路口是賽場所在地,M則表示在成都有幾條路。N=M=0表示輸入結束。接下來M行,每行包括3個整數A,B,C(1<=A,B<=N,1<=C<=1000),表示在路口A與路口B之間有一條路,咱們的工做人員須要C分鐘的時間走過這條路。
輸入保證至少存在1條商店到賽場的路線。循環
Output數據
對於每組輸入,輸出一行,表示工做人員從商店走到賽場的最短期
Sample Input算法複雜度
2 1
1 2 3
3 3
1 2 5
2 3 5
3 1 2
0 0
Sample Output
#include<stdio.h>#include<string.h>int INF=0x3f3f3f3f;//較大值表示連個路口沒路int dis[110][110];int main(){ int i,j,k,n,m,p,q,s; while(scanf("%d%d",&n,&m)!=EOF) { if(m==0&&n==0) break; for (i=1;i<=n;i++)//初始化 { for(j=1;j<=n;j++) { dis[i][j]=INF; } } for (i=0;i<m;i++) { scanf("%d%d%d",&p,&q,&s); dis[p][q]=dis[q][p]=s;//二維數組存連通的兩個路口 } for (k=1;k<=n;k++) { for (i=1;i<=n;i++) { for (j=1;j<=n;j++) { if (dis[i][j]>dis[i][k]+dis[k][j])//直接篩選替換 簡單粗暴 { dis[i][j]=dis[i][k]+dis[k][j]; } } } } printf("%d\n",dis[1][n]); } return 0;}因而可知此算法複雜度爲O(n^3);但較前者實現起來簡單好用