• 洛谷—— P1462 通往奥格瑞玛的道路


    https://www.luogu.org/problem/show?pid=1462

    题目背景

    在艾泽拉斯大陆上有一位名叫歪嘴哦的神奇术士,他是部落的中坚力量

    有一天他醒来后发现自己居然到了联盟的主城暴风城

    在被众多联盟的士兵攻击后,他决定逃回自己的家乡奥格瑞玛

    题目描述

    在艾泽拉斯,有n个城市。编号为1,2,3,...,n。

    城市之间有m条双向的公路,连接着两个城市,从某个城市到另一个城市,会遭到联盟的攻击,进而损失一定的血量。

    每次经过一个城市,都会被收取一定的过路费(包括起点和终点)。路上并没有收费站。

    假设1为暴风城,n为奥格瑞玛,而他的血量最多为b,出发时他的血量是满的。

    歪嘴哦不希望花很多钱,他想知道,在可以到达奥格瑞玛的情况下,他所经过的所有城市中最多的一次收取的费用的最小值是多少。

    输入输出格式

    输入格式:

    第一行3个正整数,n,m,b。分别表示有n个城市,m条公路,歪嘴哦的血量为b。

    接下来有n行,每行1个正整数,fi。表示经过城市i,需要交费fi元。

    再接下来有m行,每行3个正整数,ai,bi,ci(1<=ai,bi<=n)。表示城市ai和城市bi之间有一条公路,如果从城市ai到城市bi,或者从城市bi到城市ai,会损失ci的血量。

    输出格式:

    仅一个整数,表示歪嘴哦交费最多的一次的最小值。

    如果他无法到达奥格瑞玛,输出AFK。

    输入输出样例

    输入样例#1:
    4 4 8
    8
    5
    6
    10
    2 1 2
    2 4 1
    1 3 4
    3 4 3
    
    输出样例#1:
    10
    

    说明

    对于60%的数据,满足n≤200,m≤10000,b≤200

    对于100%的数据,满足n≤10000,m≤50000,b≤1000000000

    对于100%的数据,满足ci≤1000000000,fi≤1000000000,可能有两条边连接着相同的城市。

    二分答案,SPFA验证,可以先给n个点的代价排序,二分复杂度logn

    zz,验证的continue,写成return 一直WA。。

     1 #include <algorithm>
     2 #include <cstdio>
     3 #include <queue>
     4 
     5 #define max(a,b) (a>b?a:b)
     6 
     7 inline void read(int &x)
     8 {
     9     x=0; register char ch=getchar();
    10     for(; ch>'9'||ch<'0'; ) ch=getchar();
    11     for(; ch>='0'&&ch<='9'; ch=getchar()) x=x*10+ch-'0';
    12 }
    13 
    14 const int INF(0x3f3f3f3f);
    15 const int N(10626);
    16 const int M(50626);
    17 int n,m,b,f[N],a[N];
    18 int head[N],sumedge;
    19 struct Edge {
    20     int v,next,w;
    21     Edge(int v=0,int next=0,int w=0):v(v),next(next),w(w){}
    22 }edge[M<<1];
    23 inline void ins(int u,int v,int w)
    24 {
    25     edge[++sumedge]=Edge(v,head[u],w),head[u]=sumedge;
    26     edge[++sumedge]=Edge(u,head[v],w),head[v]=sumedge;
    27 }
    28 
    29 bool inq[N];
    30 long long dis[N];
    31 std::queue<int>que;
    32 
    33 int L,R,Mid,ans;
    34 inline bool check(int s,int x)
    35 {
    36     if(f[s]>x) return 0;
    37     for(int i=1; i<=n; ++i) dis[i]=1ll*INF,inq[i]=0;
    38     for(; !que.empty(); ) que.pop();
    39     dis[s]=0; que.push(s);
    40     for(int u,v; !que.empty(); )
    41     {
    42         u=que.front(); que.pop(); inq[u]=0;
    43         for(int i=head[u]; i; i=edge[i].next)
    44         {
    45             v=edge[i].v;
    46             if(f[v]>x) continue;
    47             if(dis[v]<=dis[u]+edge[i].w) continue;
    48             dis[v]=dis[u]+1ll*edge[i].w;
    49             if(!inq[v]) inq[v]=1,que.push(v);
    50         }
    51     }
    52     return dis[n]<b;
    53 }
    54 
    55 int Presist()
    56 {
    57     read(n),read(m),read(b);
    58     for(int i=1; i<=n; ++i) read(f[i]),a[i]=f[i];
    59     for(int u,v,w,i=1; i<=m; ++i)
    60         read(u),read(v),read(w),ins(u,v,w);
    61     std::sort(a+1,a+n+1);
    62     for(L=0,R=n; L<=R; )
    63     {
    64         Mid=L+R>>1;
    65         if(check(1,a[Mid]))
    66         {
    67             ans=a[Mid];
    68             R=Mid-1;
    69         }
    70         else L=Mid+1;
    71     }
    72     if(!ans) printf("AFK
    ");
    73     else printf("%d
    ",ans);
    74     return 0;
    75 }
    76 
    77 int Aptal=Presist();
    78 int main(int argc,char**argv){;}
    ——每当你想要放弃的时候,就想想是为了什么才一路坚持到现在。
  • 相关阅读:
    MYSQL转MSSQL
    SVN 服务器IP地址变更后客户端的修改
    gridview
    gridview外边距
    Android开发:自定义GridView/ListView数据源
    Android之Adapter用法总结
    collection set
    listview优化
    android应用开发全程实录-你有多熟悉listview
    android模块
  • 原文地址:https://www.cnblogs.com/Shy-key/p/7684142.html
Copyright © 2020-2023  润新知