首页 > 其他 > 详细

CodeForces - 320B Ping-Pong (Easy Version)

时间:2017-01-21 00:42:21      阅读:299      评论:0      收藏:0      [点我收藏+]

题目最开始 完全不懂 配合案例也看不懂-_-

总之就是用传递性 问能否从a区间到b区间

dfs(x,y) 走遍与第x区间所有的 联通区间 最后检验 第y区是否被访问过

是一道搜索好题 搜索还需加强

 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <string.h>
 4 
 5 using namespace std;
 6 
 7 typedef long long ll;
 8 typedef pair<ll,ll> P;
 9 int N,n = 0;//record how many intervals
10 bool vis[108];
11 P p[108];
12 
13 
14 bool check(int x, int y)
15 {
16     return ( (p[x].first < p[y].second && p[x].first > p[y].first) || (p[x].second < p[y].second && p[x].second > p[y].first) );
17 }
18 
19 void dfs(int x, int y)//x-->>start interval; y-->>end interval 把所有与x联通的区间都走一遍
20 {
21     //if(x == n) return false;//
22     if ( vis[x] || vis[y] ) return ;
23     vis[x] = true;//经过了x
24     for (int i = 0; i < n; i++)
25     {
26         if (vis[i]) continue;//hes been visited
27         if ( check(x, i) )//之前版本 if (dfs(x,i) && dfs(i,Y) return true;//每次进函数都会找 x连通的
28         {
29             dfs(i, y);
30         } //不需要dfs(x,i) check即可 因为 跳转到dfs(i, y ) 小看了dfs()想多了
31     }
32     return ;//最终只需要检查 vis[b]即可 ->b是否被走过
33 }
34 int main()
35 {
36     int query, a, b;
37     freopen("in.txt", "r", stdin);
38     scanf("%d", &N);
39     for (int i = 0; i < N; i++)
40     {
41         scanf("%d%d%d", &query, &a, &b);
42         if (query == 1)
43         {
44             p[n].first = a;
45             p[n].second = b;
46             n++;
47         }
48         else if (query == 2)
49         {
50             memset(vis, 0, sizeof(vis));
51             dfs(a-1, b-1);
52             if (vis[b-1]) printf("YES\n");
53             else printf("NO\n");
54         }
55     }
56     return 0;
57 }

 

CodeForces - 320B Ping-Pong (Easy Version)

原文:http://www.cnblogs.com/oscar-cnblogs/p/6329707.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!