zoukankan      html  css  js  c++  java
  • hdoj 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
     
    思路:以草儿家相邻的城市为起点,以草儿想去的城市为终点
     
    dijkstra算法:
     1 #include <stdio.h>
     2 #include <algorithm>
     3 #define INF 0x3f3f3f3f
     4 #define N 1010
     5 using namespace std;
     6 int s, t, d, wp[N], nei[N];
     7 int vis[N], cost[N][N], dis[N];
     8 int min(int x, int y)
     9 {
    10     return x<y ? x : y;
    11 }
    12 void dijkstra(int i)
    13 {
    14     
    15     int u, v;
    16     for(u = 1; u <= N; u++)
    17     {
    18         dis[u] = INF;
    19         vis[u] = 0;
    20     }
    21     dis[nei[i]] = 0;
    22     while(true)
    23     {
    24         v = -1;
    25         for(u = 1; u <= 1000; u++)
    26             if(!vis[u] && (v==-1 || dis[u] < dis[v]))
    27                 v = u;
    28         if(v == -1)
    29             break;
    30         vis[v] = 1;
    31         for(u = 1; u <= 1000; u++)
    32             dis[u] = min(dis[u], dis[v]+cost[v][u]);
    33     }
    34 }
    35 int main()
    36 {
    37     int i, j;
    38     while(~scanf("%d%d%d", &t, &s, &d))
    39     {
    40         for(i = 1; i < 1000; i++)
    41             for(j = i; j <= 1000; j++)
    42                 cost[i][j] = cost[j][i] = INF;
    43         int a, b, c;
    44         while(t--)
    45         {
    46             scanf("%d%d%d", &a, &b, &c);
    47             if(cost[a][b] > c)
    48                 cost[a][b] = cost[b][a] = c;
    49         }
    50         for(i = 1; i <= s; i++)
    51             scanf("%d", &nei[i]);
    52         for(i = 1; i <= d; i++)
    53             scanf("%d", &wp[i]);
    54         int min = INF;
    55         for(i = 1; i <= s; i++)
    56         {
    57             dijkstra(i);
    58             for(j = 1; j <= d; j++)
    59             {
    60                 if(min>dis[wp[j]])
    61                     min = dis[wp[j]];
    62             }
    63         }
    64         printf("%d
    ", min);
    65         //printf("%d
    ", q.top());
    66     }
    67     return 0;
    68 }

     spfa算法不用以终点为起点,只要在输入起点的时候将该点进入队列就行了

    spfa代码:

     1 #include <stdio.h>
     2 #include <string.h>
     3 #include <queue>
     4 # define INF 0x3f3f3f3f
     5 #define N 110
     6 #define M 450
     7 using namespace std;
     8 
     9 struct node
    10 {
    11     int from, to, val, next;
    12 };
    13 node edge[M];
    14 int n, m, cnt;
    15 int dis[N], vis[N], head[N];
    16 void add(int x, int y)
    17 {
    18     node e = {x, y, 1, head[x]};
    19     edge[cnt] = e;
    20     head[x] = cnt++;
    21 }
    22 void SPFA(int s)
    23 {
    24     queue<int>q;
    25     memset(vis, 0, sizeof(vis));
    26     memset(dis, INF, sizeof(dis));
    27     q.push(s);
    28     vis[s] = 1;
    29     dis[s] = 0;
    30     while(!q.empty())
    31     {
    32         int u = q.front();
    33         q.pop();
    34         vis[u] = 0;
    35         for(int i = head[u]; i != -1; i = edge[i].next)
    36         {
    37             int v = edge[i].to;
    38             if(dis[v] > dis[u] + edge[i].val)
    39             {
    40                 dis[v] = dis[u] + edge[i].val;
    41                 if(!vis[v])
    42                 {
    43                     vis[v] = 1;
    44                     q.push(v);
    45                 }
    46             }
    47         }
    48     }
    49 }
    50 int main()
    51 {
    52     while(~scanf("%d%d", &n, &m))
    53     {
    54         cnt = 0;
    55         int flag = 1;
    56         memset(head, -1, sizeof(head));
    57         while(m--)
    58         {
    59             int a, b;
    60             scanf("%d%d", &a, &b);
    61             add(a, b);
    62             add(b, a);
    63         }
    64         for(int i = 0; i < n; i++)
    65         {
    66             SPFA(i);
    67             for(int j = 0; j < n; j++)
    68             {
    69                 if(dis[j] > 7)
    70                 {
    71                     flag = 0;
    72                     break;
    73                 }
    74             }
    75         }
    76         if(flag)
    77             printf("Yes
    ");
    78         else
    79             printf("No
    ");
    80     }
    81     return 0;
    82 }

     floyd算法:

     1 #include <stdio.h>
     2 #define INF 0x3f3f3f3f
     3 #define N 1010
     4 int dis[N][N];
     5 int m;
     6 void init()
     7 {
     8     for(int i = 0; i < N; i++)
     9     for(int j = 0; j < N; j++)
    10         {
    11             if(i == j)
    12                 dis[i][j] = 0;
    13             else
    14                 dis[i][j] = INF;
    15         }
    16 }
    17 int max(int x, int y)
    18 {
    19     return x > y ? x : y;
    20 } 
    21 void floyd()
    22 {
    23     for(int k = 0; k <= m; k++)
    24         for(int i = 0; i <= m; i++)
    25         {
    26             if(dis[i][k] != INF)//如果这一步不判断的话,代码会超时 
    27                 for(int j = 0; j <= m; j++)
    28                 {
    29                     if(dis[i][j] > dis[i][k] + dis[k][j])
    30                         dis[i][j] = dis[i][k] + dis[k][j];
    31                 }
    32         }
    33 }
    34 int main()
    35 {
    36     int t, s, d;
    37     int a, b, time;
    38     while(~scanf("%d%d%d", &t, &s, &d))
    39     {
    40         m = 0;
    41         init();
    42         while(t--)
    43         {
    44             scanf("%d%d%d", &a, &b, &time);
    45             if(dis[a][b] > time) 
    46                 dis[a][b] = dis[b][a] = time;
    47             if(m < a)
    48                 m = a;
    49             if(m < b)
    50                 m = b; 
    51         } 
    52         while(s--)
    53         {
    54             scanf("%d", &a);
    55             dis[0][a] = dis[a][0] = 0;
    56         }
    57         floyd();
    58         int min = INF;
    59         while(d--)
    60         {
    61             scanf("%d", &a);
    62             if(min > dis[0][a])
    63                 min = dis[0][a];
    64         }
    65         printf("%d
    ", min);
    66     }
    67     return 0;
    68 }
  • 相关阅读:
    Android 仿淘宝头条竖直跑马灯式新闻标题及“分页思想
    Android setOnPageChangeListener 过时了怎么办?
    Android requestWindowFeature(Window.FEATURE_NO_TITLE)无效解决方法
    Android ViewPager+HorizontalScrollView实现标题栏滑动(腾讯新闻)
    Android OKHttp网络框架
    安卓开发常用网络请求框架OkHttp、Volley、XUtils、Retrofit对比
    Android 修改源码自定义SwipeRefreshLayout样式——高仿微信朋友圈下拉刷新
    Android 比SwipeRefreshLayout更漂亮和强大的下拉刷新控件:Android-MaterialRefreshLayout
    Android Error:Unable to find method 'com.android.build.gradle.api.BaseVariant.getOutputs()Ljava/util/List;'.
    Android 浅谈 RxAndroid + Retrofit + Databinding
  • 原文地址:https://www.cnblogs.com/digulove/p/4738503.html
Copyright © 2011-2022 走看看