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 }
  • 相关阅读:
    golang批量修改文件名
    golang执行带空格的cmd命令
    了解golang的可变参数(... parameters)
    ADB命令连接逍遥模拟器
    通达信如何批量导出自定义板块,以及定义常量
    通达信日K线图中取周K线指标值
    go读取通达信本地数据
    Python读取通达信本地数据
    Golang: 解析JSON数据之一
    MT【357】角度的对称性
  • 原文地址:https://www.cnblogs.com/pinkglightning/p/8426525.html
Copyright © 2011-2022 走看看