Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <queue>
- //#pragma comment(linker, "/stack:200000000")
- using namespace std;
- void min_cov_paths(int root, int parent, int *dp0, int *dp1, vector<int> *neigh){
- if(neigh[root].size() == 1 && parent!=0){
- dp0[root] = 1;
- dp1[root] = 1;
- }
- else{
- int sum = 0; //suma po dp[syn][1]
- int min_son1_diff = 1000000;
- int min_son2_diff = 1000000;
- for(int i=0; i<neigh[root].size(); i++){
- int v = neigh[root][i];
- if(v != parent){
- //min_cov_paths(v, root);
- sum += dp1[v];
- int diff = dp0[v]-dp1[v];
- if(diff < min_son1_diff){
- min_son1_diff = diff;
- }
- else{
- if(diff < min_son2_diff){
- min_son2_diff = diff;
- }
- }
- }
- }
- int w1 = sum + 1;
- int w2 = sum + min_son1_diff;
- int w3 = sum + min_son1_diff + min_son2_diff - 1;
- dp0[root] = min(w1, w2);
- dp1[root] = min(dp0[root], w3);
- }
- }
- int main(){
- int n;
- cin >> n;
- vector<int> neigh[n+1];
- for (int i=0; i<n-1; i++){
- int a, b;
- cin >> a >> b;
- neigh[a].push_back(b);
- neigh[b].push_back(a);
- }
- int root = 1;
- int dp0[n+1]; //dp0[i]<-najmniejsza liczba cie¿ek w poddrzewie wierzcho³ja i, taka ¿e jedna ze cie¿ek koñczy siê w i
- int dp1[n+1]; //dp1[i]<-najmniejsza liczba cie¿ek w poddrzewie wierzcho³ka i
- vector< pair<int, int> > order;
- queue< pair<int, int> > q; // pair.first = vertex, pair.second = parent
- q.push(make_pair(1,0));
- while(!q.empty()){
- pair<int, int> p = q.front();
- order.push_back(p);
- q.pop();
- //cout << p.first << " "<< p.second << endl;
- for(int i=0; i<neigh[p.first].size(); i++){
- if(neigh[p.first][i] != p.second){
- q.push(make_pair(neigh[p.first][i], p.first));
- }
- }
- }
- for(int i=n-1; i>=0; i--){
- min_cov_paths(order[i].first, order[i].second, dp0, dp1, neigh);
- }
- cout << dp1[root];
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement