一个人的旅行 解题报告

来源:互联网 发布:插件式软件开发 编辑:程序博客网 时间:2024/05/01 12:33

题目链接:http://acm.tzc.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=2674



#include <stdio.h>#define size 1011#define INF 0x7f7f7f7fint map[size][size];int m[size],mark[size],dis[size];int count,n;void Dijkstra(){      int i,j,k,t;      memset(mark,0,sizeof(mark));      for(i=1;i<=n;i++)      {        t=INF;        for(j=1;j<=n;j++)        {           if(mark[m[j]]==0)           {            if(dis[m[j]]<t)            {             t=dis[m[j]];             k=m[j];            }           }        }        mark[k]=1;        for(j=1;j<=n;j++)        {          if(map[k][m[j]]!=INF)          dis[m[j]]=dis[k]+map[k][m[j]]<dis[m[j]]?dis[k]+map[k][m[j]]:dis[m[j]];        }      }}int main(){    int T,S,D,i,j,k,t;    while(scanf("%d%d%d",&T,&S,&D)!=EOF)    {          n=0;          memset(mark,0,sizeof(mark));          memset(map,INF,sizeof(map));          memset(dis,INF,sizeof(dis));          for(i=1;i<=T;i++)          {            scanf("%d%d%d",&j,&k,&t);            if(mark[j]==0)mark[j]=1,m[++n]=j;            if(mark[k]==0)mark[k]=1,m[++n]=k;            map[j][k]=map[k][j]=t<map[j][k]?t:map[j][k];          }          for(i=1;i<=S;i++)          {                scanf("%d",&t);                dis[t]=0;          }          Dijkstra();          k=INF;          for(i=1;i<=D;i++)          {           scanf("%d",&t);           if(k>dis[t])           {                 k=dis[t];           }          }          printf("%d\n",k);    }    return 0;}


0 0
原创粉丝点击