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;}

原创粉丝点击