rt,RE#34,尝试加过保护机制依然是 RE 不是 WA,数组开大致 2e6 无果,求大佬救救QAQ(玄关!) 题目链接:D题 比赛链接
#include<vector>
#include<iostream>
#include<algorithm>
#define fir first
#define sec second
#define int long long
using namespace std;
const int N=5e4+5;
struct Edge{
int l,w,nxt;
}edges[N<<1];
int n,m,ans,tt=1,head[N],num[N];
vector<pair<int,int> > co[N];
void add_edge(int f,int l,int w){
edges[++tt]={l,w,head[f]};
head[f]=tt;
}
void work(int x,int y,int fa){
if(fa==x) num[1]++,num[y]--;
else num[x]++;
}
void dfs(int x,int fa){
for(int i=head[x];i;i=edges[i].nxt)
co[x].push_back({edges[i].w,edges[i].l});
sort(co[x].begin(),co[x].end());
if(co[x][0].sec!=fa) dfs(co[x][0].sec,x);
for(int i=1;i<co[x].size();i++){
if(co[x][i].fir==co[x][i-1].fir)
work(co[x][i].sec,x,fa),work(co[x][i-1].sec,x,fa);
if(co[x][i].sec!=fa) dfs(co[x][i].sec,x);
}
co[x].clear();
}
void dfs2(int x,int tot,int fa){
tot+=num[x];num[x]=tot;ans+=(!tot);
for(int i=head[x];i;i=edges[i].nxt){
int l=edges[i].l;if(l==fa) continue;
dfs2(l,tot,x);
}
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin>>n;int f,l,w;
for(int i=1;i<n;i++){
cin>>f>>l>>w;
add_edge(f,l,w);add_edge(l,f,w);
}
dfs(1,0);dfs2(1,0,0);cout<<ans<<endl;
for(int i=1;i<=n;i++) if(!num[i]) cout<<i<<endl;
return 0;
}