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!\n");

92         else printf("%d\n",ans);

93     }

94     return 0;

95 }
View Code

 

你可能感兴趣的:(Graph)