P1462通往奥格瑞玛的道路,萌新求问为什么老是差一个点.......
  • 板块灌水区
  • 楼主MI—Polaris
  • 当前回复3
  • 已保存回复3
  • 发布时间2020/9/19 13:01
  • 上次更新2023/11/5 12:59:27
查看原帖
P1462通往奥格瑞玛的道路,萌新求问为什么老是差一个点.......
276177
MI—Polaris楼主2020/9/19 13:01
//555为什么过不了昂
#include<bits/stdc++.h>
using namespace std;
const int INF=1000000000+10;
const int maxn=10000+10;
const int maxm=50000+10;
struct node
{
    int u,v,w,next;
}e[maxm<<1];
int n,m,hb,id=0;
int b[maxn],c[maxn];
int head[maxm<<1],d[maxn];
bool vis[maxn];
priority_queue<int,vector<int>,greater<int> >q;//小根堆
void add(int x,int y,int t)
{
    id++;
    e[id].u=x;
    e[id].v=y;
    e[id].w=t;
    e[id].next=head[x];
    head[x]=id;
    return;
}
bool check(int x)
{
    if(x<b[1]||x<b[n])return false;
    
    for(int i=1;i<=n;i++)d[i]=INF;
    for(int j=1;j<=n;j++)
        if(b[j]>x)vis[j]=true;
            else vis[j]=false;
    d[1]=0;q.push(1);
    while(!q.empty()){
        int now=q.top();
        q.pop();
        if(vis[now])continue;
        vis[now]=true;
        for(int i=head[now];i;i=e[i].next)
            if(d[e[i].v]>e[i].w+d[now]){
                d[e[i].v]=e[i].w+d[now];
                q.push(e[i].v);}}
    if(d[n]<=hb)return true;
        else return false;}
int main()
{
    int j,k,t,ans,maxx=0;
    cin>>n>>m>>hb;
    for(int i=1;i<=n;i++){
        cin>>b[i];
        c[i]=b[i];}
    for(int i=1;i<=m;i++){
        cin>>j>>k>>t;
        if(j==k)continue;
        add(j,k,t);
        add(k,j,t);}
    sort(c+1,c+n+1);
    int l=1,r=n,mid;
    if(!check(c[n])){
    	cout<<"AFK"<<endl;
    return 0;
}
    ans=c[n];
    while(l<=r)
	{
        mid=(l+r)>>1;
        if(check(c[mid]))
		{
            ans=c[mid];
            r=mid-1;
		}
            else l=mid+1;}
    cout<<ans; 
return 0;
}//收工收工,改天复习一下
//前提是把这道题的点过了啊...
2020/9/19 13:01
加载中...