1. 程式人生 > 實用技巧 >Codeforces Round #572 (Div. 1) A1. Add on a Tree

Codeforces Round #572 (Div. 1) A1. Add on a Tree

題目連結:https://codeforc.es/contest/1188/my

題意:每次可以選兩個葉節點,使得最短路徑的邊全部加上任意一個值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 }
View Code

第一次的錯誤程式碼

 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