码迷,mamicode.com
首页 > 其他好文 > 详细

[ZOJ 1011] NTA (dfs搜索)

时间:2014-11-19 18:17:29      阅读:267      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   io   ar   color   os   sp   for   

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1011

题目大意:在一棵树上,给你起始状态,问你能否到达终止状态。

 

给了树的前序遍历序。

直接dfs搜索。

 

  1 #include <cstdio>
  2 #include <cstdlib>
  3 #include <string>
  4 #include <iostream>
  5 #include <cstring>
  6 #include <algorithm>
  7 #include <sstream>
  8 #include <cctype>
  9 #include <vector>
 10 #include <map>
 11 #include <set>
 12 #include <iterator>
 13 #include <functional>
 14 #include <cmath>
 15 #include <numeric>
 16 #include <ctime>
 17 using namespace std;
 18 typedef long long LL;
 19 typedef pair<int,int> PII;
 20 typedef vector<int> VI;
 21 #define PB push_back
 22 #define MP make_pair
 23 #define SZ size()
 24 #define CL clear()
 25 #define AA first
 26 #define BB second
 27 #define EPS 1e-8
 28 #define ZERO(x) memset((x),0,sizeof(x))
 29 const int INF = ~0U>>1;
 30 const double PI = acos(-1.0);
 31 
 32 int n,m,k;
 33 char in[1000];
 34 vector<PII> v[1000][1000];
 35 int tree[10000];
 36 char ch[2];
 37 
 38 bool isAccepted(int sig){
 39     return sig>=n-m;
 40 }
 41 
 42 bool dfs(int rt,int sig){
 43 //    printf("rt = %d sig = %d\n",rt,sig);
 44 
 45     int rtVal = tree[rt];
 46 
 47     if( rtVal==-1 ){
 48         return isAccepted(sig);
 49     }
 50 //    printf("rtVal = %d\n",rtVal);
 51     bool res = false;
 52     for(int i=0;i<v[sig][rtVal].SZ;i++){
 53         res = dfs(rt<<1,v[sig][rtVal][i].AA);
 54         if(!res) continue;
 55         res &= dfs(rt<<1|1,v[sig][rtVal][i].BB);
 56         if( res ) break;
 57     }
 58 
 59     return res;
 60 }
 61 
 62 int main(){
 63     int kase = 1;
 64     while( scanf("%d%d%d",&n,&m,&k)!=EOF ){
 65         getchar();
 66         for(int i=0;i<1000;i++) for(int j=0;j<1000;j++) v[i][j].CL;
 67         if( n==0&&m==0&&k==0 ) break;
 68         for(int i=0;i<n;i++){
 69             for(int j=0;j<k;j++){
 70                 gets(in);
 71                 istringstream sss(in);
 72                 int a,b;
 73                 while( sss>> a >> b ){
 74                     v[i][j].PB(MP(a,b));
 75 //                    printf("v[%d][%d].PB(%d,%d)\n",i,j,a,b);
 76                 }
 77             }
 78         }
 79 //        puts("*****");
 80         if( kase!=1 ) puts("");
 81         printf("NTA%d:\n",kase++);
 82         int q;
 83         while( true ){
 84             memset(tree,-1,sizeof(tree));
 85             scanf("%d",&q);
 86             if( q==-1 ) break;
 87             for(int i=1;i<=(1<<(q+1))-1;i++){
 88                 scanf("%s",&ch);
 89                 if( strcmp(ch,"*")==0 ){
 90                     tree[i] = -1;
 91                 } else {
 92                     tree[i] = ch[0]-a;
 93                 }
 94 //                printf("%d ",tree[i]);
 95             }//puts("");
 96 
 97             bool ok = dfs(1,0);
 98             if(ok) puts("Valid");
 99             else puts("Invalid");
100         }
101 
102     }
103     return 0;
104 }

 

[ZOJ 1011] NTA (dfs搜索)

标签:style   blog   http   io   ar   color   os   sp   for   

原文地址:http://www.cnblogs.com/llkpersonal/p/4108672.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!