Codeforces Round #572 (Div. 1) A1. Add on a Tree
阿新 • • 發佈:2020-08-03
題目連結:https://codeforc.es/contest/1188/my
題意:每次可以選兩個葉節點,使得最短路徑的邊全部加上任意一個值x 問在有限次的操作中,能否使得邊上為任意實數都能滿足條件
思路:剛開始自己考慮的是 每條邊必須有兩種經過的方式就可以, 即除了葉節點以外的點,其他度數的點度數要為3
這樣可以讓每條邊都可以得到調整,總能調整到要求的數
但自己把1預設為根了, 所以1本身判斷的時候就錯了, 正解是 直接看每個點的度數,只要沒有度數為2的點出現即可,
因為度數為2的點一旦出現,兩條邊的經過方式肯定只有一種
1 #include<bits/stdc++.h> 2 usingView Codenamespace std; 3 #define ll long long 4 #define pb push_back 5 const int maxn =2e5+10; 6 const int mod=1e9+7; 7 vector<int>E[maxn]; 8 9 10 int main() 11 { 12 ios::sync_with_stdio(false); 13 cin.tie(0); 14 int n; 15 cin>>n; 16 for(int i=1;i<n;i++) 17 {18 int u,v; 19 cin>>u>>v; 20 E[u].pb(v); 21 E[v].pb(u); 22 } 23 for(int i=1;i<=n;i++) 24 { 25 int sum=E[i].size(); 26 if(sum<3&&sum!=1) 27 { 28 cout<<"NO"<<'\n'; 29 return0; 30 } 31 } 32 cout<<"YES"<<'\n'; 33 34 35 36 37 38 39 40 }
第一次的錯誤程式碼
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define ll long long 4 #define pb push_back 5 const int maxn =2e5+10; 6 const int mod=1e9+7; 7 vector<int>E[maxn]; 8 int vis[maxn]; 9 int cnt[maxn]; 10 11 void dfs(int u,int fa) 12 { 13 for(auto &v:E[u]) 14 { 15 if(v==fa) 16 continue; 17 dfs(v,u); 18 cnt[u]+=cnt[v]; 19 } 20 cnt[u]++; 21 } 22 23 int main() 24 { 25 ios::sync_with_stdio(false); 26 cin.tie(0); 27 int n; 28 cin>>n; 29 for(int i=1;i<n;i++) 30 { 31 int u,v; 32 cin>>u>>v; 33 E[u].pb(v); 34 E[v].pb(u); 35 } 36 if(n==2) 37 { 38 cout<<"YES"<<'\n'; 39 return 0; 40 } 41 dfs(1,0); 42 for(int i=1;i<=n;i++) 43 { 44 if(cnt[i]==1) 45 continue; 46 int sum=E[i].size(); 47 if(sum<3) 48 { 49 cout<<"NO"<<'\n'; 50 return 0; 51 } 52 } 53 cout<<"YES"<<'\n'; 54 55 56 57 58 59 60 61 }View Code