Tarango

Hackerearth DP C

Nov 13th, 2015
256
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.35 KB | None | 0 0
  1. //============================================================================
  2. // Name        : ACM
  3. // Author      : Tarango Khan
  4. // Team        : BRACU Byteheads
  5. //============================================================================
  6.  
  7. #include <bits/stdc++.h>
  8. using namespace std;
  9. #define Size 100005
  10. #define Mod 1000000007
  11. #define INF 999999999999999
  12.  
  13. struct Edge{
  14.     int v;
  15.     long long cost;
  16.     Edge(int a,long long c){
  17.         v = a;cost = c;
  18.     }
  19. };
  20.  
  21. int N;
  22. long long sing[Size];
  23. vector<Edge> Graph[Size];
  24. long long DP[Size][2];
  25.  
  26. long long call(int cur,int cnt,int f,int prev){
  27.     //printf("cur: %d , f: %d , prev: %d\n",cur,f,prev);
  28.     if(DP[cur][f] != -1) return DP[cur][f];
  29.     int Sz = Graph[cur].size();
  30.     long long res = 0;
  31.     if(f == 1){
  32.         for(int i = 0;i<Sz;i++){
  33.             Edge e = Graph[cur][i];
  34.             if(e.v == prev) continue;
  35.             long long ret1 = call(e.v,cnt,0,cur);
  36.             long long ret2 = call(e.v,cnt+1,1,cur) + sing[e.v];
  37.             res += min(ret1,ret2);
  38.         }
  39.     }else{
  40.         if(Sz == 1 && prev != -1){
  41.             res = sing[cur];
  42.         }else{
  43.             long long ans1 = 0,ans2 = INF;
  44.             for(int i = 0;i<Sz;i++){
  45.                 Edge e = Graph[cur][i];
  46.                 if(e.v == prev) continue;
  47.                 ans1 += call(e.v,cnt,0,cur) + sing[cur];
  48.             }
  49.             long long sum = 0;
  50.             for(int i = 0;i<Sz;i++){
  51.                 Edge e = Graph[cur][i];
  52.                 if(e.v == prev) continue;
  53.                 sum += call(e.v,cnt,0,cur);
  54.             }
  55.             for(int i = 0;i<Sz;i++){
  56.                 Edge e = Graph[cur][i];
  57.                 if(e.v == prev) continue;
  58.                 long long ret1 = sum + call(e.v,cnt+1,1,cur) + e.cost - call(e.v,cnt,0,cur);
  59.                 ans2 = min(ans2,ret1);
  60.             }
  61.             res = min(ans1,ans2);
  62.         }
  63.     }
  64.     //printf("  -> From %d , f: %d , res: %lld\n",cur,f,res);
  65.     return DP[cur][f] = res;
  66. }
  67.  
  68. long long call2(int cur,int prev){
  69.     long long res = 1;
  70.     if(DP[cur][0] == DP[cur][1]) res++;
  71.     int Sz = Graph[cur].size();
  72.     for(int i = 0;i<Sz;i++){
  73.         Edge e = Graph[cur][i];
  74.         if(e.v == prev) continue;
  75.         res  = (res * call2(e.v,cur))%Mod;
  76.     }
  77.     return res;
  78. }
  79.  
  80. int main() {
  81.     int u,v;
  82.     long long c;
  83.     scanf("%d",&N);
  84.     for(int i = 0;i<N;i++){
  85.         scanf("%lld",&sing[i]);
  86.     }
  87.     for(int i = 0;i<N-1;i++){
  88.         scanf("%d %d %lld",&u,&v,&c);
  89.         u--;v--;
  90.         Graph[u].push_back(Edge(v,c));
  91.         Graph[v].push_back(Edge(u,c));
  92.     }
  93.     memset(DP,-1,sizeof(DP));
  94.     long long res1 = call(0,0,0,-1);
  95.     long long res2 = call2(0,-1)%Mod;
  96.     printf("%lld %lld\n",res1,res2);
  97.     return 0;
  98. }
  99. Language: C++
Add Comment
Please, Sign In to add comment