洛谷1462 通往奥格瑞玛的道路 最短路&&二分

SPFA和二分的使用

跑一下最短路看看能不能回到奥格瑞玛,二分收费最多的点

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
#define maxn 10005
#define maxm 50005
#define inf 2000000000

int n,m,b,cnt,ans;
int c[maxn],dis[maxn];
int head[maxm];
bool vis[maxn];
struct edge{
    int next,to,w;
}e[maxm<<1];
void insert(int u,int v,int k){
    cnt++;
    e[cnt].next=head[u];e[cnt].to=v;e[cnt].w=k;
    head[u]=cnt;
}
bool spfa(int x){
    queue<int> q;
    memset(vis,0,sizeof vis);
    memset(dis,0x3f,sizeof dis);
    vis[1]=1;dis[1]=0;
    q.push(1);
    while(!q.empty()){
        int now=q.front();
        q.pop();vis[now]=0;
        for(int i=head[now];i;i=e[i].next){
            int k=e[i].to;
            if(c[k]>x)continue;
            if(dis[k]>dis[now]+e[i].w){
                dis[k]=dis[now]+e[i].w;
                if(!vis[k]){
                    vis[k]=1;
                    q.push(k);
                }
            }
        }
    }
    if(b-dis[n]<=0||dis[n]==inf)return 0;
    return 1;
}
int main(){
    int l=0,r=0;
    scanf("%d%d%d",&n,&m,&b);
    for(int i=1;i<=n;i++){
        scanf("%d",&c[i]);
        r=max(r,c[i]);
    }
    int u,v,k;
    for(int i=1;i<=m;i++){
        scanf("%d%d%d",&u,&v,&k);
        insert(u,v,k);
        insert(v,u,k);
    }
    if(spfa(inf)){
        int mid=(l+r)>>1;
        while(l<=r){
            if(spfa(mid)){
                r=mid-1;
                ans=mid;
            }
            else l=mid+1;
        mid=(l+r)>>1;
        }
    printf("%d\n",ans);
    }
    else printf("AFK\n");
    return 0;
}
View Code

 

posted @ 2017-09-29 11:06  Elfish?  阅读(155)  评论(0编辑  收藏  举报