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

SRM 628 DIV2 1000 CandleTimerEasy 状态压缩+DFS

时间:2014-11-03 22:30:46      阅读:286      评论:0      收藏:0      [点我收藏+]

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

题意:给你一个树型蜡烛,你可以从1个或多个叶子开始点蜡烛,问你能使蜡烛烧完以后能得到时间的个数。

解题思路:状态压缩枚举DFS,

解题代码:

bubuko.com,布布扣
  1 // BEGIN CUT HERE
  2 /*
  3 
  4 */
  5 // END CUT HERE
  6 #line 7 "CandleTimerEasy.cpp"
  7 #include <cstdlib>
  8 #include <cctype>
  9 #include <cstring>
 10 #include <cstdio>
 11 #include <cmath>
 12 #include <algorithm>
 13 #include <vector>
 14 #include <string>
 15 #include <iostream>
 16 #include <sstream>
 17 #include <map>
 18 #include <set>
 19 #include <queue>
 20 #include <stack>
 21 #include <fstream>
 22 #include <numeric>
 23 #include <iomanip>
 24 #include <bitset>
 25 #include <list>
 26 #include <stdexcept>
 27 #include <functional>
 28 #include <utility>
 29 #include <ctime>
 30 using namespace std;
 31 
 32 #define PB push_back
 33 #define MP make_pair
 34 
 35 #define REP(i,n) for(i=0;i<(n);++i)
 36 #define FOR(i,l,h) for(i=(l);i<=(h);++i)
 37 #define FORD(i,h,l) for(i=(h);i>=(l);--i)
 38 
 39 typedef vector<int> VI;
 40 typedef vector<string> VS;
 41 typedef vector<double> VD;
 42 typedef long long LL;
 43 typedef pair<int,int> PII;
 44 
 45 int hs[30];
 46 struct node{
 47   int ne,w;
 48   node(int _ne ,int _w)
 49   {
 50      ne = _ne ; 
 51      w = _w; 
 52   }
 53 };
 54 vector<node> mp[30];
 55 vector<int> leaf;
 56 int ans[41*1000];
 57 int ti[30];
 58 class CandleTimerEasy
 59 {
 60         public:
 61         int n ;
 62         int sum;    
 63         void dfs(int k ,int fa , int t)
 64         {
 65     //        printf("%d %d %d\n",k,fa,t);
 66                if(t < ti[k])
 67             {
 68                 ti[k] = t;
 69 
 70             }
 71             int num = mp[k].size();
 72             for(int i = 0 ;i < num ;i ++)
 73             {
 74              if(mp[k][i].ne != fa)
 75                dfs(mp[k][i].ne,k,t + mp[k][i].w);      
 76             }
 77         }
 78         void solve(vector<int> A,vector<int> B,vector<int> len)
 79         {
 80           int k = leaf.size();
 81           int num = (1 << k) -1;
 82           //printf("********%d\n",ti[0]);
 83           memset(ans,0,sizeof(ans));
 84           
 85           for(int i = 0 ;i <= num ; i ++)
 86           {
 87               for(int j = 0 ;j <= n ;j ++)
 88               {
 89                ti[j] = 1e8;
 90               }
 91               int hehe = 0 ; 
 92               for(int j = 0 ;j < k ;j ++)
 93               {
 94                  if((i >> j ) & 1)
 95                  {
 96                 //    printf("%d ",leaf[j]);
 97                     dfs(leaf[j],-1,0);
 98                     hehe ++ ;
 99                  }
100               }
101              // puts("");
102               if(hehe == 0 )
103                   continue;
104               int mx = 0 ;
105               /*for(int j = 0 ;j <= n;j ++)
106                   printf("%d ",ti[j]);
107               printf("\n");
108               */
109               for(int j = 0 ;j < n;j ++)
110               {
111                   int tt; 
112                   if(abs(ti[A[j]] - ti[B[j]]) < len[j])
113                   {
114                     
115                    int  tmi = min(ti[A[j]],ti[B[j]]); 
116                    int  tmx = max(ti[A[j]],ti[B[j]]);
117                    tt = tmx*2 + (len[j]-(tmx-tmi));
118                   }else{
119                     tt = min(ti[A[j]],ti[B[j]]) + len[j];
120                     tt *= 2;
121                   }
122                 //  printf("%.1lf ",tt*1.0/2);
123                   //printf("%d\n",tt);
124                   mx = max(tt,mx);
125               }
126               //printf("***%.1lf\n",mx*1.0/2);
127              // printf("%d\n",mx);
128               if(ans[mx] == 0 )
129               {
130                   ans[mx] ++ ;
131                   sum ++ ; 
132               }
133           }
134         }
135         int differentTime(vector <int> A, vector <int> B, vector <int> len)
136         {
137            n = A.size();
138            sum = 0 ;
139            leaf.clear();
140            memset(hs,0,sizeof(hs));
141            for(int i = 0 ;i <= 20 ;i ++)
142                mp[i].clear();
143            for(int i = 0;i < n; i ++)
144            {
145               mp[A[i]].push_back(node(B[i],len[i]));
146               mp[B[i]].push_back(node(A[i],len[i]));
147               hs[A[i]] ++ ; 
148               hs[B[i]] ++ ; 
149            }
150 
151            for(int i = 0;i <= n;i ++ )
152            {
153               if(hs[i] == 1 )
154                 leaf.push_back(i);            
155            }
156            solve(A,B,len);
157            return sum;
158         }
159          
160 // BEGIN CUT HERE
161     public:
162     void run_test(int Case) { if ((Case == -1) || (Case == 0)) test_case_0(); if ((Case == -1) || (Case == 1)) test_case_1(); if ((Case == -1) || (Case == 2)) test_case_2(); if ((Case == -1) || (Case == 3)) test_case_3(); if ((Case == -1) || (Case == 4)) test_case_4(); if ((Case == -1) || (Case == 5)) test_case_5(); }
163     private:
164     template <typename T> string print_array(const vector<T> &V) { ostringstream os; os << "{ "; for (typename vector<T>::const_iterator iter = V.begin(); iter != V.end(); ++iter) os << \" << *iter << "\","; os << " }"; return os.str(); }
165     void verify_case(int Case, const int &Expected, const int &Received) { cerr << "Test Case #" << Case << "..."; if (Expected == Received) cerr << "PASSED" << endl; else { cerr << "FAILED" << endl; cerr << "\tExpected: \"" << Expected << \" << endl; cerr << "\tReceived: \"" << Received << \" << endl; } }
166     void test_case_0() { int Arr0[] = {0,1}; vector <int> Arg0(Arr0, Arr0 + (sizeof(Arr0) / sizeof(Arr0[0]))); int Arr1[] = {1,2}; vector <int> Arg1(Arr1, Arr1 + (sizeof(Arr1) / sizeof(Arr1[0]))); int Arr2[] = {10,1}; vector <int> Arg2(Arr2, Arr2 + (sizeof(Arr2) / sizeof(Arr2[0]))); int Arg3 = 2; verify_case(0, Arg3, differentTime(Arg0, Arg1, Arg2)); }
167     void test_case_1() { int Arr0[] = {0,0,0}; vector <int> Arg0(Arr0, Arr0 + (sizeof(Arr0) / sizeof(Arr0[0]))); int Arr1[] = {1,2,3}; vector <int> Arg1(Arr1, Arr1 + (sizeof(Arr1) / sizeof(Arr1[0]))); int Arr2[] = {1,1,1}; vector <int> Arg2(Arr2, Arr2 + (sizeof(Arr2) / sizeof(Arr2[0]))); int Arg3 = 2; verify_case(1, Arg3, differentTime(Arg0, Arg1, Arg2)); }
168     void test_case_2() { int Arr0[] = {0,0,0}; vector <int> Arg0(Arr0, Arr0 + (sizeof(Arr0) / sizeof(Arr0[0]))); int Arr1[] = {1,2,3}; vector <int> Arg1(Arr1, Arr1 + (sizeof(Arr1) / sizeof(Arr1[0]))); int Arr2[] = {1,2,3}; vector <int> Arg2(Arr2, Arr2 + (sizeof(Arr2) / sizeof(Arr2[0]))); int Arg3 = 4; verify_case(2, Arg3, differentTime(Arg0, Arg1, Arg2)); }
169     void test_case_3() { int Arr0[] = {0,1,1,2,3,3,2,4}; vector <int> Arg0(Arr0, Arr0 + (sizeof(Arr0) / sizeof(Arr0[0]))); int Arr1[] = {1,2,3,4,5,6,7,8}; vector <int> Arg1(Arr1, Arr1 + (sizeof(Arr1) / sizeof(Arr1[0]))); int Arr2[] = {5,3,2,4,6,8,7,1}; vector <int> Arg2(Arr2, Arr2 + (sizeof(Arr2) / sizeof(Arr2[0]))); int Arg3 = 7; verify_case(3, Arg3, differentTime(Arg0, Arg1, Arg2)); }
170     void test_case_4() { int Arr0[] = {0,0,0,0}; vector <int> Arg0(Arr0, Arr0 + (sizeof(Arr0) / sizeof(Arr0[0]))); int Arr1[] = {1,2,3,4}; vector <int> Arg1(Arr1, Arr1 + (sizeof(Arr1) / sizeof(Arr1[0]))); int Arr2[] = {123,456,789,1000}; vector <int> Arg2(Arr2, Arr2 + (sizeof(Arr2) / sizeof(Arr2[0]))); int Arg3 = 8; verify_case(4, Arg3, differentTime(Arg0, Arg1, Arg2)); }
171     void test_case_5() { int Arr0[] = {0}; vector <int> Arg0(Arr0, Arr0 + (sizeof(Arr0) / sizeof(Arr0[0]))); int Arr1[] = {1}; vector <int> Arg1(Arr1, Arr1 + (sizeof(Arr1) / sizeof(Arr1[0]))); int Arr2[] = {1000}; vector <int> Arg2(Arr2, Arr2 + (sizeof(Arr2) / sizeof(Arr2[0]))); int Arg3 = 2; verify_case(5, Arg3, differentTime(Arg0, Arg1, Arg2)); }
172 
173 // END CUT HERE
174 
175 };
176 
177 // BEGIN CUT HERE
178 int main()
179 {
180         CandleTimerEasy ___test;
181         ___test.run_test(-1);
182         return 0;
183 }
184 // END CUT HERE
View Code

 

SRM 628 DIV2 1000 CandleTimerEasy 状态压缩+DFS

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

原文地址:http://www.cnblogs.com/zyue/p/4072210.html

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