zoukankan      html  css  js  c++  java
  • cf D. Dima and Trap Graph

    http://codeforces.com/contest/366/problem/D

    遍历下界,然后用二分求上界,然后用dfs去判断是否可以。

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <algorithm>
     4 #define maxn 10000
     5 using namespace std;
     6 
     7 int n,m;
     8 int head[maxn];
     9 bool vis[maxn];
    10 int e;
    11 int pl[maxn],pr[maxn];
    12 int ans;
    13 struct node
    14 {
    15     int u,v;
    16     int l,r;
    17     int next;
    18 }p[maxn*4];
    19 
    20 void inti()
    21 {
    22     memset(vis,false,sizeof(vis));
    23     memset(head,-1,sizeof(head));
    24     e=0;
    25 }
    26 
    27 void add(int u,int v,int l,int r)
    28 {
    29     p[e].u=u;
    30     p[e].v=v;
    31     p[e].l=l;
    32     p[e].r=r;
    33     p[e].next=head[u];
    34     head[u]=e++;
    35 }
    36 
    37 bool dfs(int u,int l,int r)
    38 {
    39     if(l>r) return false;
    40     vis[u]=true;
    41     if(u==n) return true;
    42     for(int i=head[u]; i!=-1; i=p[i].next)
    43     {
    44         int v=p[i].v,ll=p[i].l,rr=p[i].r;
    45         if(!vis[v])
    46         {
    47             if(ll<=l&&rr>=r)
    48             {
    49                if(dfs(v,l,r)) return true;
    50             }
    51         }
    52     }
    53     return false;
    54 }
    55 
    56 
    57 int main()
    58 {
    59     while(scanf("%d%d",&n,&m)!=EOF)
    60     {
    61         inti();
    62         int u,v,l,r;
    63         int cnt=0;
    64         for(int i=1; i<=m; i++)
    65         {
    66             scanf("%d%d%d%d",&u,&v,&l,&r);
    67             add(u,v,l,r);
    68             add(v,u,l,r);
    69             pl[cnt]=l;
    70             pr[cnt++]=r;
    71         }
    72         ans=-1;
    73         sort(pl,pl+cnt);
    74         sort(pr,pr+cnt);
    75         for(int i=0; i<cnt; i++)
    76         {
    77             int l1=0;
    78             int r1=cnt;
    79             int mid=(l1+r1)>>1;
    80             while(l1<r1)
    81             {
    82                 memset(vis,false,sizeof(vis));
    83                 if(dfs(1,pl[i],pr[mid])) l1=mid+1;
    84                 else r1=mid; mid=(l1+r1)>>1;
    85             }
    86             if(pl[i]<=pr[mid-1])
    87             {
    88                 ans=max(ans,pr[mid-1]-pl[i]+1);
    89             }
    90         }
    91         if(ans==-1) printf("Nice work, Dima!
    ");
    92         else printf("%d
    ",ans);
    93     }
    94     return 0;
    95 }
    View Code
  • 相关阅读:
    引擎设计跟踪(一)
    Gamebyro 加入CEGUI
    开播庆祝
    引擎设计跟踪(八) Mile stone 2 准备中
    引擎设计跟踪(六)
    编辑器框架的思考
    地形法线贴图的优化
    引擎设计跟踪(五)
    引擎设计跟踪(九.2) 3DS MAX 导出插件 继续
    引擎设计跟踪(三)
  • 原文地址:https://www.cnblogs.com/fanminghui/p/3954415.html
Copyright © 2011-2022 走看看