码迷,mamicode.com
首页 > 其他好文 > 详细

hdoj 2066 一个人的旅行【最短路的3种写法】

时间:2015-08-21 21:36:41      阅读:250      评论:0      收藏:0      [点我收藏+]

标签:最短路

一个人的旅行

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 25159    Accepted Submission(s): 8743


Problem Description
虽然草儿是个路痴(就是在杭电待了一年多,居然还会在校园里迷路的人,汗~),但是草儿仍然很喜欢旅行,因为在旅途中 会遇见很多人(白马王子,^0^),很多事,还能丰富自己的阅历,还可以看美丽的风景……草儿想去很多地方,她想要去东京铁塔看夜景,去威尼斯看电影,去阳明山上看海芋,去纽约纯粹看雪景,去巴黎喝咖啡写信,去北京探望孟姜女……眼看寒假就快到了,这么一大段时间,可不能浪费啊,一定要给自己好好的放个假,可是也不能荒废了训练啊,所以草儿决定在要在最短的时间去一个自己想去的地方!因为草儿的家在一个小镇上,没有火车经过,所以她只能去邻近的城市坐火车(好可怜啊~)。
 

Input
输入数据有多组,每组的第一行是三个整数T,S和D,表示有T条路,和草儿家相邻的城市的有S个,草儿想去的地方有D个;
接着有T行,每行有三个整数a,b,time,表示a,b城市之间的车程是time小时;(1=<(a,b)<=1000;a,b 之间可能有多条路)
接着的第T+1行有S个数,表示和草儿家相连的城市;
接着的第T+2行有D个数,表示草儿想去地方。
 

Output
输出草儿能去某个喜欢的城市的最短时间。
 

Sample Input
6 2 3 1 3 5 1 4 7 2 8 12 3 8 4 4 9 12 9 10 2 1 2 8 9 10
 

Sample Output
9
 



/*dijkstra*/
#include<cstdio>
#include<cstring>
#include<algorithm>
#define MAX 0x3f3f3f
using namespace std;
int map[1500][1500],dis[1500],vis[1500];
int t,s,d,n;
void dijkstra(int s)
{
      memset(vis, 0, sizeof(vis));
      int i,j,k,l;
      for(i = 1; i <= n;i++)
      dis[i] = map[s][i];
      vis[s] = 1;      
      for(i = 1;i < n; i++)
      {
            l = MAX;
            for( j = 1; j <= n;j++)
            if(!vis[j] && dis[j] < l)
            {
                  l = dis[j];
                  k = j;
            }
            if(l < MAX)
                  vis[k] = 1;
            else
                  break;      
            for(j = 1; j <= n; j++ )
            if( !vis[j] )
            dis[j] = min(dis[j],dis[k]+map[k][j]);      
      }
}
int main()
{
      int i,j,k,a,b,c;
      while(scanf("%d%d%d",&t, &s, &d)!=EOF)
      {
            for(i = 0;i < 1500; i++)
            for(j = 0;j < 1500; j++)
            {
                  if(i ==j)
                        map[i][j]=0;
                  else
                        map[i][j] = map[j][i] = MAX;
            }
            n = 0;
            while(t--)
            {
                  scanf("%d%d%d",&a,&b,&c);
                  if(c < map[a][b])
                        map[a][b] = map[b][a] = c;
                  n = max(max(a,b),n);
            }
            while(s--)
            {
                  scanf("%d",&a);
                  map[0][a] =map[a][0] = 0;
            }
            dijkstra(0);
            int mx = MAX;
            while(d--)
            {
                  scanf("%d",&a);
                  if(mx > dis[a])
                  mx = dis[a];
            }
            printf("%d\n", mx);
      }
      return 0;
}

/*spfa*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<queue>
#include<algorithm>
#define INF 0x3f3f3f
using namespace std;
struct node{
    int a,b,val,next;
};
node p[10100];
int head[1010],edgenum;
int t,s,d;
int q[200],x[200],flag;
int dis[1010],vis[1010];
void add(int u,int v,int w)
{
      node E = {u,v,w,head[u]};
      p[edgenum] = E;
      head[u] = edgenum++;
}
void spfa(int sx)
{
      memset(dis,0x3f,sizeof(dis));
      memset(vis,0,sizeof(vis));
      dis[sx] = 0;
      vis[sx] = 1;
      queue<int> q;
      q.push(sx);
      while(!q.empty())
      {
            int u = q.front(); q.pop(); vis[u] = 0;
            for(int i = head[u]; i != -1; i = p[i].next)
            {
                  int v = p[i].b;
                  if(dis[v] > dis[u]+p[i].val)
                  {
                        dis[v] = dis[u]+p[i].val;
                        if(!vis[v])
                        {
                              vis[v] = 1;
                              q.push(v);
                        }
                  }
            }
      }
                  
}
int main()
{
      int i,j,k;
      while(scanf("%d%d%d",&t, &s, &d)!=EOF)
      {
            memset(head,-1,sizeof(head));
            int a,b,tim;
            while(t--)
            {
                  scanf("%d%d%d",&a,&b,&tim);
                  add(a,b,tim);
                  add(b,a,tim);
            }
            for(i = 0; i< s; i++)
                  scanf("%d",&q[i]);
            int w = INF;
            for(i = 0; i < d; i++)
                  scanf("%d",&x[i]);
            for(i = 0; i < s; i++)
            {
                  spfa(q[i]);
                  for(j = 0; j < d;j++ )
                  {
                        if(w > dis[x[j]])
                        w = dis[x[j]];
                  }            
            }      
            printf("%d\n",w);
      }
    return 0;
}

/*floyd*/
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define INF 0x3f3f3f3f
using namespace std;
int dis[1001][1001],m,zx;
int q[1001],z[1001];
void floyd()
{
      int i,j,k;
      for(k = 0; k <= m; k++)
      for(i = 0; i <= m; i++)
      if(dis[i][k] != INF)
      {
            for(j = 0; j <= m ;j++)
            {
                  dis[i][j] = min(dis[i][j],dis[i][k]+dis[k][j]);
            }
      }
}
int main()
{
      int i,j,k,t,s,d,a,b,c;
      while(scanf("%d%d%d",&t,&s,&d)!=EOF)
      {
            m = 0;
            for(i = 0; i < 1001; i++)
            for(j = 0; j < 1001; j++)
            {
                  if(i == j)      dis[i][j] = 0;
                  else dis[i][j] = INF;
            }
            while(t--)
            {
                  scanf("%d%d%d",&a,&b,&c);
                  if(dis[a][b] > c)
                  dis[a][b] = dis[b][a] = c;
                  m = max(max(a,b),m);
            }
            memset(q,0,sizeof(q));
            memset(z,0,sizeof(z));
            for(i = 0; i < s;i++)
                  scanf("%d", &q[i]);      
            for(i = 0; i < d;i++)
                  scanf("%d", &z[i]);
            floyd();
            zx = INF;  
            for(i=0;i<s;i++)
            for(j=0;j<d;j++)
                zx=min(zx,dis[q[i]][z[j]]);
            printf("%d\n",zx);            
      }
      return 0;
}


版权声明:原创文章,若要转载,请与博主联系,谢谢

hdoj 2066 一个人的旅行【最短路的3种写法】

标签:最短路

原文地址:http://blog.csdn.net/liu6886/article/details/47839083

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!