HDU 2066 一個人的旅行 Floyd
阿新 • • 發佈:2019-01-01
題目大意:給定T條路,S個起點,D個終點,求最短的起點到終點的距離。
題目分析:Floyd,再注意一點小細節,在Floyd的同時更新最小值。
同時總結一下Floyd應該注意的問題:
1、初始化,要將所有map的值都初始化為MAXN
2、注意是否是雙向邊
3、Floyd的時候 K要放在最外層,即第一層。
4、做必要的優化比如在迴圈的時候 設定一個map[i][k]!=MAXN
如下程式碼:
#include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #define MAXN 1000000 #define N 1010 using namespace std; int map[N][N],s[N],e[N],maxx; int T,S,D; int floyd() { int res=MAXN; for(int k=1;k<=maxx;k++) for(int i=1;i<=maxx;i++) if(map[i][k]!=MAXN)//優化 for(int j=1;j<=maxx;j++) { if(map[i][j]>map[i][k]+map[k][j]) map[i][j]=map[i][k]+map[k][j]; if(s[i]&&e[j]&&res>map[i][j])//隨時更新 res=map[i][j]; } return res; } int main() { while(scanf("%d%d%d",&T,&S,&D)!=EOF) { memset(map,0,sizeof(map)); memset(s,0,sizeof(s)); memset(e,0,sizeof(e)); for(int i=1;i<=1000;i++)//初始化 for(int j=1;j<=1000;j++) map[i][j]=MAXN; int u,v,w; for(int i=1;i<=T;i++) { scanf("%d%d%d",&u,&v,&w); maxx=max(maxx,max(u,v)); map[u][v]=w; } for(int i=1;i<=S;i++) { scanf("%d",&u); s[u]=1; } for(int i=1;i<=D;i++) { scanf("%d",&u); e[u]=1; } printf("%d\n",floyd()); } // while(1); return 0; }