zoukankan      html  css  js  c++  java
  • 一个人的旅行 HDU-2066 (SPFA)

    http://acm.hdu.edu.cn/showproblem.php?pid=2066

    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
     
    把每个城市当做起点,分别跑spfa:
      1 #include <iostream>
      2 #include <algorithm>
      3 #include <cstdio>
      4 #include <cstring>
      5 #include <queue>
      6 #include <stack>
      7 #include <vector>
      8 
      9 const int inf = 0x3f3f3f3f;
     10 
     11 using namespace std;
     12 
     13 struct node
     14 {
     15     int v, w, next;
     16 }edge[1000005];
     17 
     18 int head[1005], dis[1005], num[1005], tot;
     19 bool vis[1005];
     20 
     21 void add(int u, int v, int w)
     22 {
     23     tot++;
     24     edge[tot].v = v;
     25     edge[tot].w = w;
     26     edge[tot].next = head[u];
     27     head[u] = tot;
     28 }
     29 
     30 void init(int s)
     31 {
     32     memset(dis, inf, sizeof(dis));
     33     memset(num, 0, sizeof(num));
     34     memset(vis, false, sizeof(vis));
     35     dis[s] = 0;
     36 }
     37 
     38 bool spfa(int s, int t)
     39 {
     40     init(s);
     41     queue <int> que; ///队列
     42     que.push(s);
     43     vis[s] = 1;
     44     num[s]++;
     45     while(!que.empty())
     46     {
     47         int cur = que.front();
     48         que.pop();
     49         vis[cur] = 0;
     50         for(int i=head[cur];i;i=edge[i].next)
     51         {
     52             int v = edge[i].v;
     53             if(dis[v]>dis[cur]+edge[i].w)
     54             {
     55                 dis[v] = dis[cur] + edge[i].w;
     56                 if(!vis[v])
     57                 {
     58                     que.push(v);
     59                     vis[v] = true;
     60                     //num[v]++;
     61                     //if(num[v] > t) return false; ///超过总边数,存在负环,(当然,这道题不存在这种情况,不写也可)
     62                 }
     63             }
     64         }
     65     }
     66     return true;
     67 }
     68 
     69 int main()
     70 {
     71     int t, s, d;
     72     int city[1005], like[1005];
     73     while(~scanf("%d %d %d", &t, &s, &d))
     74     {
     75         tot = 0;
     76         memset(head, 0, sizeof(head));
     77         for(int i=0;i<t;i++) 78         {
     79             int u, v, w;
     80             scanf("%d %d %d", &u, &v, &w);
     81             add(u, v, w);
     82             add(v, u, w);
     83         }
     84         for(int i=0;i<s;i++)
     85         {
     86             scanf("%d", &city[i]);
     87         }
     88         for(int i=0;i<d;i++)
     89         {
     90             scanf("%d", &like[i]);
     91         }
     92         int minn = inf;
     93         for(int i=0;i<s;i++)
     94         {
     95             spfa(city[i], t);
     96             for(int j=0;j<d;j++)
     97             {
     98                 minn = min(minn, dis[like[j]]);
     99             }
    100         }
    101         printf("%d
    ", minn);
    102     }
    103 
    104     return 0;
    105 }

    或者直接把城市设成起点:

      1 #include <iostream>
      2 #include <algorithm>
      3 #include <cstdio>
      4 #include <cstring>
      5 #include <queue>
      6 #include <stack>
      7 #include <vector>
      8 
      9 const int inf = 0x3f3f3f3f;
     10 
     11 using namespace std;
     12 
     13 struct node
     14 {
     15     int v, w, next;
     16 }edge[1000005];
     17 
     18 int head[1005], dis[1005], num[1005], tot;
     19 bool vis[1005];
     20 
     21 void add(int u, int v, int w)
     22 {
     23     tot++;
     24     edge[tot].v = v;
     25     edge[tot].w = w;
     26     edge[tot].next = head[u];
     27     head[u] = tot;
     28 }
     29 
     30 void init(int s)
     31 {
     32     memset(dis, inf, sizeof(dis));
     33     memset(num, 0, sizeof(num));
     34     memset(vis, false, sizeof(vis));
     35     dis[s] = 0;
     36 }
     37 
     38 bool spfa(int s, int t)
     39 {
     40     init(s);
     41     queue <int> que; ///队列
     42     que.push(s);
     43     vis[s] = 1;
     44     num[s]++;
     45     while(!que.empty())
     46     {
     47         int cur = que.front();
     48         que.pop();
     49         vis[cur] = 0;
     50         for(int i=head[cur];i;i=edge[i].next)
     51         {
     52             int v = edge[i].v;
     53             if(dis[v]>dis[cur]+edge[i].w)
     54             {
     55                 dis[v] = dis[cur] + edge[i].w;
     56                 if(!vis[v])
     57                 {
     58                     que.push(v);
     59                     vis[v] = true;
     60                     //num[v]++;
     61                     //if(num[v] > t) return false; ///超过总边数,存在负环,(当然,这道题不存在这种情况,不写也可)
     62                 }
     63             }
     64         }
     65     }
     66     return true;
     67 }
     68 
     69 int main()
     70 {
     71     int t, s, d;
     72     int city[1005], like[1005];
     73     while(~scanf("%d %d %d", &t, &s, &d))
     74     {
     75         tot = 0;
     76         memset(head, 0, sizeof(head));
     77         for(int i=0;i<t;i++) 78         {
     79             int u, v, w;
     80             scanf("%d %d %d", &u, &v, &w);
     81             add(u, v, w);
     82             add(v, u, w);
     83         }
     84         for(int i=0;i<s;i++)
     85         {
     86             scanf("%d", &city[i]);
     87         }
     88         for(int i=0;i<d;i++)
     89         {
     90             scanf("%d", &like[i]);
     91         }
     92         int minn = inf;
     93         for(int i=0;i<s;i++)
     94         {
     95             spfa(city[i], t);
     96             for(int j=0;j<d;j++)
     97             {
     98                 minn = min(minn, dis[like[j]]);
     99             }
    100         }
    101         printf("%d
    ", minn);
    102     }
    103 
    104     return 0;
    105 }
  • 相关阅读:
    linux下的进程
    进程间通讯
    const关键字
    关于嵌入式web服务器
    指针
    内存管理(malloc和free的用法)
    关于read和fread
    C库的制作
    C语言考试
    docker 配置阿里云镜像加速
  • 原文地址:https://www.cnblogs.com/0xiaoyu/p/12856328.html
Copyright © 2011-2022 走看看