1. 程式人生 > >最短路(bellman)-hdu2066

最短路(bellman)-hdu2066

題目連結:https://vjudge.net/problem/HDU-2066

題目描述:

程式碼實現:

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int T,S,D;
const int MAXN =1e6+10;
const int INF = 0x3f3f3f3f;
struct edge{
    int from,to,d;
}E[MAXN];
int d[MAXN],a[MAXN],b[MAXN];
void bellman(int
s){ fill(d,d+MAXN,INF); d[s]=0; for(int i=0;i<T;i++){ bool flag=false; for(int j=0;j<T*2;j++){ if(d[E[j].to] > d[E[j].from]+E[j].d){//因為這裡需要以S種不同的起點a[i](i從1~S)來遍歷圖並進行鬆弛,所以前面不加d[E[j].to]!=INF這個條件 flag=true; d[E[j].to]=d[E[j].from
]+E[j].d; } } if(!flag) break; } } int main(){ while(~scanf("%d%d%d",&T,&S,&D)){ for(int i=0;i<T;i++){ int from,to,d; scanf("%d%d%d",&from,&to,&d); E[i]=(edge){from,to,d}; E[i+T]=(edge){to,from
,d}; } for(int i=0;i<S;i++) scanf("%d",&a[i]); for(int i=0;i<D;i++) scanf("%d",&b[i]); int ans=INF; for(int i=0;i<S;i++){ bellman(a[i]);//對每個不同的可以直達的城市作為起點開始遍歷,找出最短的能到達眾多目的地中任何一個目的地的路徑距離
for(int j=0;j<D;j++){ ans=min(ans,d[b[j]]);//眾多目的地點只需能夠到達其中一點,並且距離最短即可 } } printf("%d\n",ans); } return 0; }