Codeforces Round #572 (Div. 1) A1. Add on a Tree ###K ###K //K
题目链接:https://codeforces.ml/contest/1188/problem/A1
题意:每次可以选两个叶节点,使得最短路径的边全部加上任意一个值x 问在有限次的操作中,能否使得边上为任意实数都能满足条件
思路:刚开始自己考虑的是 每条边必须有两种经过的方式就可以, 即除了叶节点以外的点,其他度数的点度数要为3
这样可以让每条边都可以得到调整,总能调整到要求的数
但自己把1默认为根了, 所以1本身判断的时候就错了, 正解是 直接看每个点的度数,只要没有度数为2的点出现即可,
因为度数为2的点一旦出现,两条边的经过方式肯定只有一种
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 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 return 0; 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 }

浙公网安备 33010602011771号