zoukankan      html  css  js  c++  java
  • 最短路 || HDU 2066 一个人的旅行

    本草的旅行故事(✺ω✺),可以从S个点中的任意一个开始,到达D个点中的任意一个,求最短路

    *解法:把草儿的家记成点0,S个点与0的距离为0,然后spfa求最短路

    又是改了一万次,①多组数据啊 ②改完多组数据记得加初始化啊 ③无向图反着也要建啊 

    脑子可能被我丢在被窝里了zzzzZ

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <queue>
     5 using namespace std;
     6 #define SZ 20005
     7 #define INF 1e9+10
     8 int head[SZ],nxt[SZ],tot = 0;
     9 struct edge
    10 {
    11     int t,d;
    12 }l[SZ];
    13 void build(int f,int t,int d)
    14 {
    15     l[++tot] = (edge){t,d};
    16     nxt[tot] = head[f];
    17     head[f] = tot;
    18 }
    19 queue<int> q;
    20 bool use[SZ];
    21 int dist[SZ];
    22 void spfa(int s)
    23 {
    24     memset(dist, 63, sizeof(dist));
    25     memset(use, 0, sizeof(use));
    26     use[s] = 1;
    27     dist[s] = 0;
    28     q.push(s);
    29     while(!q.empty())
    30     {
    31         int u = q.front(); q.pop();
    32         use[u] = 0;
    33         for(int i = head[u];i;i = nxt[i])
    34         {
    35             int v = l[i].t;
    36             if(dist[v] > dist[u] + l[i].d)
    37             {
    38                 dist[v] = dist[u] + l[i].d;
    39                 if(!use[v])
    40                     use[v] = 1, q.push(v);
    41             }
    42         }
    43     }
    44     return;
    45 }
    46 int main()
    47 {
    48     int T, S, D;
    49     while(scanf("%d %d %d", &T, &S, &D) != EOF)
    50     {
    51         memset(head, 0, sizeof(head));
    52         tot = 0;
    53         for(int i = 0; i < T; i++)
    54         {
    55             int x, y, z;
    56             scanf("%d %d %d", &x, &y, &z);
    57             build(x, y, z);
    58             build(y, x, z);
    59         }
    60         for(int i = 0;i < S; i++)
    61         {
    62             int x;
    63             scanf("%d", &x);
    64             build(0, x, 0);
    65             build(x, 0, 0);//反着也要建
    66         }
    67         spfa(0);
    68         int minn = INF;
    69         for(int i = 0; i < D; i++)
    70         {
    71             int ed;
    72             scanf("%d", &ed);
    73             minn = min(minn, dist[ed]);
    74         }
    75         printf("%d
    ", minn);
    76     }
    77     return 0;
    78 }
  • 相关阅读:
    面试8:找二叉树的下个结点
    面试8:找二叉树的下个结点
    面试题7:重建二叉树
    面试题7:重建二叉树
    Kenneth A.Lambert著的数据结构(用python语言描述)的第一章课后编程答案
    基础的Mapgis三维二次开发-插件式
    面试题6:从尾到头打印链表
    C语言中声明和定义详解(待看。。
    面试题5:替换空格
    面试题5:替换空格
  • 原文地址:https://www.cnblogs.com/pinkglightning/p/8426525.html
Copyright © 2011-2022 走看看