HDOJ 2066 一个人的旅游

来源:互联网 发布:暨南大学网络教学 编辑:程序博客网 时间:2024/05/04 08:33

一个人的旅游,还是dijkstra,不过记得构造小草编号为0到邻接城市的边长度为0。

代码

#include<iostream>using namespace std;const int INF=0x7fffffff;int dist[2005],map[2005][2005];bool visit[2005];int n;void init(){     int i,j;     for( i=0; i<=n; i++){          for( j=0; j<=n; j++)               if( !map[i][j])                   map[i][j]=INF;          dist[i]=INF;          visit[i]=false;     }}void Dijkstra(int s){    int mim,pt,i;    dist[s]=0;    pt=s;    while( true){           visit[pt]=true;           for( i=0; i<=n; i++)                if( !visit[i]&&map[pt][i]!=INF)                    dist[i]=min(dist[i],dist[pt]+map[pt][i]);           mim=INF;           pt=-1;           for( i=0; i<=n; i++){                if( !visit[i]&&mim>dist[i]){                    mim=dist[i];                    pt=i;                }           }           if( pt==-1) break;     }           }int main(){    int s,t,d,i,j,x;    while( scanf("%d%d%d",&t,&s,&d)!=EOF){           memset(map,0,sizeof(map));           while( t--){                  scanf("%d%d%d",&i,&j,&x);                  n=max(n,max(i,j));                  if( map[i][j]==0||x<map[i][j])                      map[i][j]=map[j][i]=x;           }            init();           while( s--){                  scanf("%d",&i);                  map[0][i]=map[i][0]=0;           }           Dijkstra(0);           x=INF;           while( d--){                  scanf("%d",&t);                  if( x>dist[t])                      x=dist[t];           }           printf("%d\n",x);          }                return 0;}


原创粉丝点击