• CF 187C Weak Memory 优先队列 难度:2


    http://codeforces.com/problemset/problem/187/C

    这道题可以用二分+dfs检测,或者优先队列解

    此处用了优先队列解法

    从起点出发,维护一个优先队列,内容是pair<当前所需最小容量,节点序号>,则每一次取出的都一定是最小容量,也就是说结果必然大于等于这个容量

    #include <cstdio>
    #include <queue>
    #include <cstring>
    using namespace std;
    typedef pair<int ,int >P;
    priority_queue<P,vector<P>,greater<P> > que;
    const int maxn=1e5+5;
    const int maxm=4e5+5;
    const int inf=0x7fffffff;
    
    int n,m,k,s,e;
    bool g[maxn];
    int cap[maxn];
    
    int first[maxn];
    int nxt[maxm];
    int to[maxm];
    
    void add(int f,int t,int ind){
            nxt[ind]=first[f];
            first[f]=ind;
            to[ind]=t;
    }
    int main(){
            scanf("%d%d%d",&n,&m,&k);
            fill(cap,cap+n+1,inf);
            memset(first,-1,sizeof(first));
            for(int i=0;i<k;i++){
                    int guide;
                    scanf("%d",&guide);
                    g[guide]=true;
            }
    
            for(int i=0;i<m;i++){
                    int f,t;
                    scanf("%d%d",&f,&t);
                    add(f,t,2*i);
                    add(t,f,2*i+1);
            }
            scanf("%d%d",&s,&e);
    
            int ans=0;
            cap[s]=0;
            que.push(P(0,s));
            while(!que.empty()){
                    int c=que.top().first,f=que.top().second;que.pop();
                    if(c>cap[f])continue;
    
                    ans=max(ans,c);
                    if(f==e)break;
    
                    if(g[f])c=0;
                    for(int p=first[f];p!=-1;p=nxt[p]){
                            if(cap[to[p]]>c+1){
                                    cap[to[p]]=c+1;
                                    que.push(P(c+1,to[p]));
                            }
                    }
            }
    
            printf("%d",cap[e]==inf?-1:ans);
            return 0;
    }
    

      

  • 相关阅读:
    git命令参考
    Raft 简介
    关于 K8S 的几个问题
    Ubuntu中用普通方法无法添加自启动
    so编译 链接和加载
    GDB调试命令详解
    MinGW中的头文件路径
    GDB使用详解
    dlopen、dlsym和dlclose的使用
    Windows下配置VSCode使用mingww64的gcc、g++编译器和GDB调试器
  • 原文地址:https://www.cnblogs.com/xuesu/p/4296886.html
Copyright © 2020-2023  润新知