hdu——2066(dijkstra最短路)

来源:互联网 发布:oracle nvl mysql 编辑:程序博客网 时间:2024/06/05 12:02

题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=2066

注:wrong了8次。应该是边界情况未处理好。

可借鉴地址(提供了另一种思维方式):http://www.cnblogs.com/heqinghui/archive/2012/11/23/2784297.html

#include <iostream>#include <cstring>#include <algorithm>#define INF 0xfffffffusing namespace std;#define N 1001int w[N][N];int d[N];int n;int visited[N];int f[N];//记录相邻的城市 int g[N];//记录喜欢到的城市 void dijkstra(int st){int i;memset(visited,0,sizeof(visited));for(i=1;i<=n;i++) d[i]=(i==st)?0:INF;for(i=1;i<=n;i++)        {   int x,m=INF;  for(int j=1;j<=n;j++)  if(!visited[j]&&d[j]<m) m=d[x=j];  visited[x]=1;  for(int j=1;j<=n;j++)  if(!visited[j]&&w[x][j]!=INF) d[j]=min(d[j],d[x]+w[x][j]); }}int main(){int i,j,k,t;int m;int u,v;int l;while(cin>>m>>l>>t){for(i=1;i<=N;i++) for(j=1;j<=N;j++)            w[i][j]=INF;                n=N-1;for(i=0;i<m;i++) { cin>>u>>v>>k; if(w[u][v]>k)   //可能多条路 { w[u][v]=k; w[v][u]=k; } //n=max(u,max(v,n));  换成这句之后就一直在wrong ,应该是边界情况未处理好。 }     int Min=INF;            for(i=0;i<l;i++)    cin>>f[i];             for(i=0;i<t;i++)    cin>>g[i]; for(i=0;i<l;i++)  {  dijkstra(f[i]);   for(j=0;j<t;j++)    if(d[g[j]]<Min)  Min=d[g[j]];    }    cout<<Min<<endl;}return 0;}