• 【洛谷 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他还没死!!!我爱spfa

    #include<cstdio>
    #include<iostream>
    #include<cmath>
    #include<cstdlib>
    #include<cstring>
    #include<algorithm>
    #include<queue>
    #include<map>
    typedef long long ll;
    using namespace std;
    const int oo=0x3f3f3f3f;
    int bb,n,m,k,cnt,x,y,z,s,t,vis[20020];
    ll dis[20002];
    struct node{
        int to;
        int val;
        int next;
    }e[200005];
    int head[20002],a[20003],fa[20004],v;
    map <pair<int , int> , int> cvis;
    void add(int a,int b,int c){
        e[++cnt].to=b; e[cnt].val=c;
        e[cnt].next=head[a]; head[a]=cnt;
    }
    queue<int>q;
    bool spfa(int xj){
        for(int i=1 ;i<=n;++ i) {
            vis[i] = 0;
            if(a[i]<=x) fa[i]=0;
            else fa[i]=1;
        }
        for(int i = 2 ; i <= n; ++ i) 
            dis[i] = 0x7fffffff;
        memset(dis,0x3f,sizeof(dis));
        memset(vis,0,sizeof(vis));
        for(int i=1;i<=n;i++){
            if(a[i]<=xj) fa[i]=0;
            else fa[i]=1;
        }
        vis[1]=1; dis[1]=0; q.push(1);
        while(!q.empty()){
            x=q.front(); q.pop(); 
            if(fa[x]) continue; vis[x]=0;
            for(int i=head[x];i;i=e[i].next){
                v=e[i].to;
                if(fa[v]) continue; 
                if(dis[v]>dis[x]+e[i].val){
                    dis[v]=dis[x]+e[i].val;
                    if(!vis[v]) { q.push(v); vis[v]=1; }
                }
            }
        }
        return dis[n]<=bb;
    }
    int main(){
    
        scanf("%d %d %d",&n,&m,&bb);
        int l=0,r=0;
        for(int i=1;i<=n;i++){
            scanf("%d",&a[i]);
            r=max(r,a[i]);
        }
        for(int i=1;i<=m;i++){
            scanf("%d %d %d",&x,&y,&z);
            
            add(x,y,z); add(y,x,z);
        }
        int ans=0;
        if(!spfa(1000000005)) 
           { puts("AFK");  return 0; }
        while(l<=r){
            int mid=(l+r)/2;
            if(spfa(mid)) ans=mid,r=mid-1;
            else l=mid+1;
        }
        printf("%d
    ",ans);
        return 0;
    }
  • 相关阅读:
    NotFoundHttpException
    postMan
    Extjs win
    Extjs toolbar 如何添加竖杆分隔符
    Extjs iconCls 的用法
    b站Java基本语法4之进制转换
    b站Java基本语法4之基本数据类型的运算规则
    b站数据库课2之连接查询
    b站Java尚硅谷0
    b站数据库课1之分组函数分组查询
  • 原文地址:https://www.cnblogs.com/wuhu-JJJ/p/11777057.html
Copyright © 2020-2023  润新知