CF187C Weak Memory

题解:
二分+bfs,二分最长距离,这个题在bfs时使用堆来处理会变得比较简单,优先去走油量较多的那个点(某个点当前能量最大一定“有利于”接下来点的转移),每当遇到特殊点的时候,把油量加满即可。
走到终点即返回true。没走到返回false即可。

代码:

/*Keep on going Never give up*/
//#pragma GCC optimize(2)
#include<bits/stdc++.h>
//#include<iostream>
//#include<string>
//#include<cmath>
//#include<vector>
//#include<algorithm>
//#include<queue>
//#include<string.h>

#define int long long
#define endl '\n'

using namespace std;
const int maxn=2e5+10;
const int mo=1000;

bool isvis[maxn];
int head[maxn<<1];
struct node{
    int to,next;
}edge[maxn<<1];
int cnt=0;
inline void add(int u,int v){
    edge[cnt].to=v;
    edge[cnt].next=head[u];
    head[u]=cnt++;
}
int s,t;int n,m,k;
int dis[maxn];
struct xx{
    int first,second;
    bool operator < (const xx & b) const{
        return first<b.second;
    }
};

bool bfs(int x){
    //memset(visited,false,sizeof visited);
    memset(dis,-1,sizeof dis);
    priority_queue<xx> q;
    dis[s]=x;
    q.push({s,x});
    while(!q.empty()){
        auto temp=q.top();q.pop();
        if(temp.second==0) continue;
        for(int i=head[temp.first];~i;i=edge[i].next){
            int to=edge[i].to;
            int w=temp.second-1;
            if(to==t) return true;
            if(isvis[to]) w=x;
            if(dis[to]<w){
                dis[to]=w;
                q.push({to,dis[to]});
            }
        }
    }
//    for(int i=1;i<=n;i++) cout<<dis[i]<<" ";
//    cout<<endl;
    return false;
}
inline int read(){
   int s=0,w=1;
   char ch=getchar();
   while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
   while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
   return s*w;
}

signed main(){

    memset(isvis,false,sizeof isvis);
    memset(head,-1,sizeof head);

    cin>>n>>m>>k;
    for(int i=0;i<k;i++){
        int x;
        x=read();
        isvis[x]=true;
    }
    for(int i=0;i<m;i++){
        int u,v;
        u=read(),v=read();
        add(u,v);add(v,u);
    }
    cin>>s>>t;

    //cout<<bfs(3)<<endl;

    int l=1,r=2e5+10,ans=-1;
    while(l<=r){
        int mid=(l+r)/2;
        if(bfs(mid)){
            ans=mid;
            r=mid-1;
        }
        else l=mid+1;
        //cout<<mid<<endl;
    }
    cout<<ans<<endl;

}
题解 文章被收录于专栏

主要写一些题目的题解

全部评论

相关推荐

10-30 10:16
南京大学 Java
永远的鹅孝子:给南大✌️跪了
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务