1001-造花(简单版)
只有度为2的节点是有可能被去除的,所以遍历所有度为2的节点。
假设这个2度节点被删除了,那么判断剩下的两边能否构成菊花图。
给几个特殊样例
9
1 4 1 2 2 3 3 6 3 5 6 7 6 8 6 9
正确答案:No
6
1 2 2 3 3 4 4 5 5 6
正确答案:Yes
7
1 2 2 3 3 4 4 5 5 6 6 7
正确答案:Yes
#include<iostream>
#include<vector>
using namespace std;
const int MAXN=2e5+5;
vector<int>v[MAXN];
int n;
void solve(){
cin>>n;
for(int i=1;i<=n;i++) v[i].clear();
for(int i=1;i<n;i++){
int t1,t2;
scanf("%d %d",&t1,&t2);
v[t1].push_back(t2);
v[t2].push_back(t1);
}
int leaf=0;
int node2=0;
vector<int>root;
for(int i=1;i<=n;i++){
if(v[i].size()==1) leaf++;
if(v[i].size()==2) root.push_back(i);
if(v[i].size()>=2) node2++;
}
//cout<<node2<<' '<<leaf<<endl;
for(auto x:root){
int _leaf=leaf;
int _node2=node2;
if(v[v[x][0]].size()==2) _node2--;
if(v[v[x][0]].size()==2&&(v[v[v[x][0]][0]].size()<=1||v[v[v[x][0]][1]].size()<=1)
||v[v[x][0]].size()==1) _node2++;
if(v[v[x][1]].size()==2) _node2--;
if(v[v[x][1]].size()==2&&(v[v[v[x][1]][0]].size()<=1||v[v[v[x][1]][1]].size()<=1)
||v[v[x][1]].size()==1) _node2++;
// cout<<"&:"<<x<<' '<<_node2<<' '<<_leaf<<endl;
if(_node2<=3){
cout<<"Yes"<<endl;
return;
}
}
cout<<"No"<<endl;
}
int main(){
int T;cin>>T;
while(T--){
solve();
}
}