zoukankan      html  css  js  c++  java
  • 2019.2.15 t2

    考虑倒过来计算最短路径长度,设dis[u]表示在最坏情况下,点u到最近的一 个出口的最短路,则p个出口的dis值都是0,答案即为dis[0]。

     1 #include <cstdio>
     2 #include <iostream>
     3 #include <cstring>
     4 #include <cmath>
     5 #include <cctype>
     6 #include <queue>
     7 #include <algorithm>
     8 using namespace std;
     9 
    10 #define res register int
    11 #define LL long long
    12 #define inf 0x3f3f3f3f
    13 inline int read()
    14 {
    15     int x(0),f(1); char ch;
    16     while(!isdigit(ch=getchar())) if(ch=='-') f=-1;
    17     while(isdigit(ch)) x=x*10+ch-'0',ch=getchar();
    18     return f*x;
    19 }
    20 
    21 inline int max(int x,int y){return x>y?x:y;}
    22 inline int min(int x,int y){return x<y?x:y;}
    23 const int N=1000000+10;
    24 int n,m,k,d,tot;
    25 int head[N],ver[N<<1],nxt[N<<1],edge[N<<1];
    26 int dis[N],vis[N];
    27 inline void add(int x,int y,int z){
    28     ver[++tot]=y; nxt[tot]=head[x]; head[x]=tot; edge[tot]=z;
    29 }
    30 struct node{
    31     int id;
    32     LL dd;
    33     bool operator<(const node &n2) const {
    34     return dd>n2.dd;}
    35 };
    36 priority_queue<node> q;
    37 
    38 inline LL dij()
    39 {
    40     while(q.size())
    41     {
    42         node now=q.top(); q.pop();
    43         int x=now.id,z=now.dd;
    44         if(++vis[x]>d+1) continue;
    45         if(vis[x]==d+1 || !dis[x])
    46         {
    47             dis[x]=z;
    48             for(res i(head[x]) ; i ; i=nxt[i])
    49             {
    50                 int y=ver[i];
    51                 if(dis[y]==inf)
    52                     q.push((node){ver[i],dis[x]+(LL)edge[i]});
    53             }
    54         }
    55     }
    56 }
    57 
    58 int main()
    59 {
    60     freopen("maze.in","r",stdin);
    61     freopen("maze.out","w",stdout);
    62 
    63     memset(dis,inf,sizeof(dis));
    64     n=read(); m=read(); k=read(); d=read();
    65     for(res i=1 ; i<=m ; i++)
    66     {
    67         int x=read(),y=read(),z=read();
    68         add(x,y,z); add(y,x,z);
    69     }
    70     for(res i=1 ; i<=k ; i++)
    71     {
    72         int x=read(); dis[x]=0;
    73         q.push((node){x,0});
    74     }
    75     dij();
    76     if(dis[0]==inf) puts("-1");
    77     else cout<<dis[0]<<endl;
    78 
    79     return 0;
    80 }
    View Code
  • 相关阅读:
    窗体1打开窗体2的方法
    C#中窗体间传递数据的几种方法(转载)
    只读字段和常量
    Datepicker控件
    .NET中的加密和解密
    ASP.NET网页生命周期事件
    hdu 1394 Minimum Inversion Number(逆序数对) : 树状数组 O(nlogn)
    我的第一次博客
    弹性布局
    HTML标签部分(块级/行级)
  • 原文地址:https://www.cnblogs.com/wmq12138/p/10385907.html
Copyright © 2011-2022 走看看