原题链接:
题面:
题意
就是给你一个图,是这样构成的:有多个如右图这种,星型的,然后两个之间只能在度为1的点之间连接一条边,让你把原来的星型图还原出来。
思路
一开始想简单了,从度最大的开始以此bfs
,发现不对;发现只能在两个度为1的点之间连接一条边,那么相邻的两个星型图中间点距离应该为3,如右图
,很容易确定度唯为1的点连接的点就是一个星点,从此开始dfs
找到距离是3的倍数即可即可。
代码
const int N = 2e5+100;
vector<int> g[N];
int d[N];
bool vis[N];
void solve(){
int n; cin >> n;
for(int i = 1; i < n; i++) {
int u, v; cin >> u >> v;
g[u].push_back(v);
g[v].push_back(u);
++ d[u], ++ d[v];
}
int sta = 0;
for(int i = 1; i <= n; i++) if(d[i] == 1) sta = i;
vector<int> te, ans;
function<void(int, int)> dfs = [&](int n, int de) {
vis[n] = 1;
if(de % 3 == 0) te.push_back(n);
for(auto i:g[n]) {
if(vis[i]) continue;
dfs(i, de + 1);
}
};
dfs(g[sta][0], 0);
for(auto &i:te) {
ans.push_back(g[i].size());
}
sort(all(ans));
for(auto i:ans) cout << i << ' ';
cout << '\n';
}