zoukankan      html  css  js  c++  java
  • P4568 [JLOI2011]飞行路线

    传送门:https://www.luogu.org/problem/P4568

    就是一个分层图

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 
     4 int n,m,k;
     5 int s,t;
     6 int dis[15][50009];
     7 int vis[15][50009];
     8 struct node{
     9     int numk,num,val;
    10     bool operator <(const node &a)const
    11     {
    12         return a.val<val;
    13     }
    14 };
    15 struct edge{
    16     int next,to,w;
    17 }e[3000009];int tot;
    18 int first[50009];
    19 inline void add_edge(int a,int b,int c)
    20 {
    21     e[++tot].next=first[a];
    22     e[tot].to=b;
    23     e[tot].w=c;
    24     first[a]=tot;
    25 }
    26 inline int read()
    27 {
    28     int x=0,f=1;char ch=getchar();
    29     while(ch<'0'||ch>'9'){if(ch=='-')f=1;ch=getchar();}
    30     while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
    31     return x*f;
    32 }
    33 inline void dijkstra()
    34 {
    35     priority_queue<node>q;
    36     memset(dis,0x3f3f3f3f,sizeof(dis));
    37     dis[0][s]=0;
    38     q.push((node){0,s,0});
    39     while(!q.empty())
    40     {
    41         node uall=q.top();
    42         int uk=uall.numk;
    43         int u=uall.num;
    44         q.pop();
    45         if(vis[uk][u])continue;
    46         vis[uk][u]=true;
    47         for(register int i=first[u];i;i=e[i].next)
    48         {
    49             int v=e[i].to;
    50             if(uk+1<=k&&dis[uk][u]<dis[uk+1][v])
    51             {
    52                 dis[uk+1][v]=dis[uk][u];
    53                 if(vis[uk+1][v]==false)q.push((node){uk+1,v,dis[uk+1][v]});
    54             }
    55             if(dis[uk][u]+e[i].w<dis[uk][v])
    56             {
    57                 dis[uk][v]=dis[uk][u]+e[i].w;
    58                 if(vis[uk][v]==false)q.push((node){uk,v,dis[uk][v]});
    59             }
    60         }
    61     }
    62 }
    63 int main()
    64 {
    65     n=read(),m=read(),k=read();
    66     s=read(),t=read();
    67     for(register int i=1,a,b,c;i<=m;i++)
    68     {
    69         a=read(),b=read(),c=read();
    70         add_edge(a,b,c);
    71         add_edge(b,a,c);
    72     }
    73     dijkstra();
    74     int ans=99999999;
    75     for (register int i=0;i<=k;i++)
    76         ans=min(ans,dis[i][t]);
    77     cout<<ans;
    78 }

  • 相关阅读:
    python基础-枚举定义错误码
    凸包-Graham扫描法
    [USACO04OPEN]MooFest
    [USACO16OPEN]262144
    [ASPNETCORE] 抛砖引玉,EFCORE 软删除和自动添加审计的实现
    java 文件读取汇总
    java 各类型转换 convert
    java 各类型初始化汇总
    java 常用类型占用字节数
    Maven 常用命令
  • 原文地址:https://www.cnblogs.com/1129-tangqiyuan/p/11615348.html
Copyright © 2011-2022 走看看