Advertisement
bartekltg

ZIM

Nov 26th, 2012
198
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.03 KB | None | 0 0
  1. #include <cstdlib>
  2. #include <cstdio>
  3. #include <algorithm>
  4. #include <vector>
  5. #include <set>
  6.  
  7. using namespace std;
  8.  
  9. class droga
  10. {public:
  11.     int dokad;
  12.     int koszt; //podzielność kosztu na 2, liczymy nadmiarowe przebiegi.
  13.     droga(int d,int k){dokad=d; koszt=k%2;  }
  14. };
  15.  
  16. class skrzyzowanie
  17. {public:
  18.     int mk0;
  19.     int mk1;
  20.     int mk2; //minmalny koszt dodatkowy dla 0, 1 i 2 wchodzących konców
  21.     vector <droga> krawedzie;
  22. };
  23.  
  24.  
  25. void przetwarzaj ( vector<skrzyzowanie>&skrz, int ojc, int w )
  26. {
  27.     int krawedzi=skrz[w].krawedzie.size();
  28.  
  29.     if ((krawedzi==1)&&(skrz[w].krawedzie[0].dokad==ojc))
  30.     {
  31.         skrz[w].mk0=0;
  32.         skrz[w].mk1=0;
  33.         skrz[w].mk2=0;
  34.     }else
  35.     {
  36.         int sum0=0;
  37.         int min1a=0; // moze sie oplacać zrobic koncowkę w tym miejscu.
  38.         int min1b=0;
  39.         int min2 =0;
  40.        
  41.         for (int i=0; i<krawedzi; i++)
  42.         {
  43.             int dziecko = skrz[w].krawedzie[i].dokad;
  44.             if ( dziecko != ojc)
  45.             {
  46.                 przetwarzaj ( skrz, w, dziecko );
  47.  
  48.                 int koszt_drogi = skrz[w].krawedzie[i].koszt;
  49.                 int koszt =skrz[dziecko].mk0 + koszt_drogi;
  50.                
  51.                 int poprawka1 = skrz[dziecko].mk1 + (1-koszt_drogi) - koszt;
  52.                 //ile się poprawi, gdy w dziecko wpuścimy jedną koncówkę.
  53.                 int poprawka2 = skrz[dziecko].mk2 + (koszt_drogi) - koszt;
  54.                 //ile się poprawi, gdy w dziecko wpuścimy dwie koncówki.
  55.  
  56.                 sum0 += koszt;
  57.                 if (min2>poprawka2)  min2 = poprawka2;
  58.                 if (min1b>poprawka1) min1b=poprawka1;
  59.                 if (min1a>min1b) swap(min1a,min1b);
  60.             }
  61.         }
  62.         skrz[w].mk0=sum0;
  63.         skrz[w].mk1=sum0 + min1a;
  64.         skrz[w].mk2=sum0 + min( min1a+min1b, min2 );
  65.                
  66.  
  67.     }//end nietrywialne kwawedzie
  68.    
  69. }
  70.  
  71. int main()
  72. {
  73.     int n;
  74.     long long int koszt_konieczny=0;
  75.     scanf("%d",&n);
  76.  
  77.     vector<skrzyzowanie>skrz(1+n);
  78.  
  79.     for (int i=0;i<n-1;i++)
  80.     {
  81.         int a, b, d;
  82.         scanf ("%d %d %d",&a, &b, &d);
  83.         skrz[a].krawedzie.push_back(droga(b,d));
  84.         skrz[b].krawedzie.push_back(droga(a,d));
  85.         koszt_konieczny+=d;
  86.     }
  87.  
  88.     przetwarzaj(skrz,0,1);
  89.  
  90.     printf("%lld", koszt_konieczny + min(min(skrz[1].mk0,skrz[1].mk1),skrz[1].mk2));
  91.  
  92.     return 0;
  93. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement