zoukankan      html  css  js  c++  java
  • luogu P1462 通往奥格瑞玛的道路 最短路

    二分最大钱数即可。

     1 #include <cstdio>
     2 #include <queue>
     3 #include <algorithm>
     4 #include <cstring>
     5 using namespace std;
     6 typedef long long ll;
     7 struct pot
     8 {
     9     int x;
    10     ll dis;
    11     pot (int _x = 0,ll _dis = 0) : x(_x),dis(_dis) {}
    12     friend bool operator < (pot a,pot b)
    13     {
    14         return a.dis > b.dis;
    15     }
    16 };
    17 int head[11000],to[110000],cst[110000],nxt[110000],val[110000];
    18 bool vis[11000];
    19 ll dis[11000];
    20 priority_queue <pot> que;
    21 int b,n,m,cnt;
    22 void add(int x,int y,int v)
    23 {
    24     nxt[++cnt] = head[x];
    25     to[cnt] = y;
    26     head[x] = cnt;
    27     val[cnt] = v;
    28 }
    29 void dijkstra(int s,int lmt)
    30 {
    31     for(int i=1; i<= n; i++) dis[i]=2e14;
    32     que.push(pot(s,0));
    33     dis[s]=0;
    34     memset(vis,0,sizeof(vis));
    35     while(!que.empty())
    36     {
    37         pot now=que.top();
    38         que.pop();
    39         if(vis[now.x]) continue;
    40         vis[now.x]=true;
    41         for(int i = head[now.x]; i; i=nxt[i])
    42         {
    43             if (cst[to[i]] > lmt) continue;
    44             if(dis[to[i]]>dis[now.x]+val[i])
    45             {
    46                 dis[to[i]]=dis[now.x]+val[i];
    47                 que.push(pot(to[i],dis[to[i]]));
    48             }
    49         }
    50     }
    51 }
    52 int main()
    53 {
    54     scanf("%d%d%d",&n,&m,&b);
    55     for (int i = 1;i <= n;i++) scanf("%d",&cst[i]);
    56     int tx,ty,tv;
    57     for (int i = 1;i <= m;i++) 
    58     {
    59         scanf("%d%d%d",&tx,&ty,&tv);
    60         add(tx,ty,tv);
    61         add(ty,tx,tv); 
    62     }
    63     int l = 0,r = 1000000000,mid;
    64     while (l < r)
    65     {
    66         mid = l + r >> 1;
    67         dijkstra(1,mid);
    68         if (dis[n] <= b) r = mid;
    69         else l = mid + 1;
    70     }
    71     dijkstra(1,l);
    72     if (dis[n] <= b) printf("%d
    ",l);
    73     else printf("AFK
    ");
    74     return 0;
    75 }
    心之所动 且就随缘去吧
  • 相关阅读:
    lnmp搭建禅道项目
    Vue 常用指令
    vue-tools
    阿里巴巴iconfont使用
    vue创建项目
    yarn 安装vue
    php 名字中间加星号
    图片转base64
    php阿里云短信功能
    php实名认证,身份证号,姓名加照片比对
  • 原文地址:https://www.cnblogs.com/iat14/p/11219190.html
Copyright © 2011-2022 走看看