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;
}

  

posted @ 2015-02-21 11:11  雪溯  阅读(392)  评论(1编辑  收藏  举报