hdu 2066 最短路径Dijkstra算法
来源:互联网 发布:淘宝好听的店铺名字 编辑:程序博客网 时间:2024/05/18 00:44
#include <iostream>#include <cstdio>const int N=10000;using namespace std;int a[1005][1005],b[1005],bz[1005],lj[1005],xq[1005],ma;int djik(int s){int i,j,k,mi;for(i=1;i<=ma;i++) { b[i]=a[s][i]; bz[i]=0; } bz[s]=1; b[s]=0; for(i=1;i<ma;i++) { for(mi=N,k=j=1;j<=ma;j++) if(bz[j]==0&&b[j]<mi) mi=b[j],k=j; bz[k]=1; for(j=1;j<=ma;j++) if(bz[j]==0&&a[k][j]<N) { int d=b[k]+a[k][j]; if(d<b[j]) b[j]=d; } }}int main(){int m,m1,i,j,c,cc,x,y,d,n;while(cin>>n>>m>>m1){ memset(a,1,sizeof(a));for(ma=1,i=1;i<=n;i++){scanf("%d%d%d",&x,&y,&d); if(d<a[x][y]) a[x][y]=a[y][x]=d; //陷阱二:重边问题 if(x>ma) ma=x; //陷阱一:n不是最大的顶点 if(y>ma) ma=y;}for(i=1;i<=m;i++) scanf("%d",&lj[i]); for(i=1;i<=m1;i++) scanf("%d",&xq[i]); for(cc=N,i=1;i<=m;i++) { djik(lj[i]); for(j=1;j<=m1;j++) if(bz[xq[j]]&&b[xq[j]]<cc) cc=b[xq[j]]; } printf("%d\n",cc); }return 0;}