• cogs 1685 魔法森林


    /*
        写了个傻逼二分套二分,真的傻逼了,我这tmd是在贪心呐,70分满满的人品
    */
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<queue>
    #define maxn 50010
    using namespace std;
    int head[maxn],num,n,m,mx1,mx2,mid1,mid2,ans=0x7fffffff;
    bool vis[maxn],ok[100010];
    struct node{int to,pre,v1,v2;}e[200010];
    struct Node{int from,to,v1,v2;}edge[100010];
    void Insert(int from,int to,int v1,int v2){
        e[++num].to=to;
        e[num].v1=v1;
        e[num].v2=v2;
        e[num].pre=head[from];
        head[from]=num;
    }
    void bfs(){
        queue<int>q;
        q.push(1);vis[1]=1;
        while(!q.empty()){
            int now=q.front();q.pop();
            for(int i=head[now];i;i=e[i].pre){
                int to=e[i].to;
                if(!vis[to]){vis[to]=1;q.push(to);}
            }
        }
    }
    bool check1(){
        memset(vis,0,sizeof(vis));
        memset(ok,0,sizeof(ok));
        memset(head,0,sizeof(head));num=0;
        for(int i=1;i<=m;i++){
            if(edge[i].v1>mid1)continue;
            Insert(edge[i].from,edge[i].to,edge[i].v1,edge[i].v2);
            Insert(edge[i].to,edge[i].from,edge[i].v1,edge[i].v2);
            ok[i]=1;
        }
        bfs();
        return vis[n];
    }
    bool check2(){
        memset(vis,0,sizeof(vis));
        memset(head,0,sizeof(head));num=0;
        for(int i=1;i<=m;i++){
            if((edge[i].v2>mid2)||(!ok[i]))continue;
            Insert(edge[i].from,edge[i].to,edge[i].v1,edge[i].v2);
            Insert(edge[i].to,edge[i].from,edge[i].v1,edge[i].v2);
        }
        bfs();
        return vis[n];
    }
    int main(){
        freopen("magicalforest11.in","r",stdin);//freopen("magicalforest.out","w",stdout);
        scanf("%d%d",&n,&m);
        int x,y,z,c;
        for(int i=1;i<=m;i++){
            scanf("%d%d%d%d",&x,&y,&z,&c);
            edge[i].from=x;edge[i].to=y;edge[i].v1=z;edge[i].v2=c;
            Insert(x,y,z,c);Insert(y,x,z,c);
            mx1=max(mx1,z);
            mx2=max(mx2,c);
        }
        bfs();
        if(!vis[n]){puts("-1");return 0;}
        int l1=1,r1=mx1;
        while(l1<=r1){
            mid1=(l1+r1)>>1;
            if(check1()){
                int l2=1,r2=mx2;
                while(l2<=r2){
                    mid2=(l2+r2)>>1;
                    if(check2())r2=mid2-1,ans=min(ans,mid1+mid2);
                    else l2=mid2+1;
                }
                r1=mid1-1;
            }
            else l1=mid1+1;
        }
        printf("%d",ans);
        return 0;
    }
  • 相关阅读:
    读书笔记:HTML5的Doctype
    2017/09/06~2017/09/10:算法练习小记
    (分治)7617:输出前k大的数
    (递归)7215:简单的整数划分问题
    (递归)2106:Boolean Expressions
    (递归)8758:2的幂次方表示
    (递归)1750:全排列
    (枚举)8469:特殊密码锁
    关于使用unigui、webxone、mysql的几个问题
    DELPHI-Delphi常用类型及定义单元
  • 原文地址:https://www.cnblogs.com/thmyl/p/8543066.html
Copyright © 2020-2023  润新知