HOW CF C
查看原帖
HOW CF C
811069
What__can__I__say楼主2025/1/22 22:09

思路:删掉度最大的,减掉与这个点相连的边,再找出第二大的。

若不对,求 hack。若对,求调。

救救吃了 7 发罚时的孩子吧 QWQ。

#include<bits/stdc++.h>
#define int long long
#define il inline
#define pii pair<int,int>
#define mk make_pair
#define fir first
#define sec second
#define pb emplace_back
#define mod 1000000007
#define put putchar
using namespace std;
il int rd(){
    int jya=0,tl=1;char jyt=getchar();
    while(!isdigit(jyt)){if(jyt=='-')tl=-1;jyt=getchar();}
    while(isdigit(jyt)){jya=(jya<<1)+(jya<<3)+(jyt-'0');jyt=getchar();}
    return jya*tl;
}
il void wr(int jjy){
    if(jjy<0)putchar('-'),jjy=-jjy;
    if(jjy>9)wr(jjy/10);
    putchar(jjy%10+48);
}
const int JYAAKIOI=1e18,N=5e5+86,M=2e5+86;
int T,n,ans,d[N],u[N],v[N],id,id2;
vector<int>g[N];
signed main(){
	//freopen("csnm.in","r",stdin);
	//freopen("csnm.out","w",stdout);
	T=rd();
	while(T--){
		n=rd();
		ans=1;
		for(int i=1;i<=n;++i)d[i]=0;
		for(int i=1;i<n;++i){
			u[i]=rd(),v[i]=rd();
			g[u[i]].pb(v[i]);
			g[v[i]].pb(u[i]);
			++d[u[i]],++d[v[i]];
		}
		id=0;
		for(int i=1;i<n;++i)if(d[id]<d[i])id=i;
		ans+=d[id]-1;
		for(auto v:g[id])--d[v];
		d[id]=0;
		id2=0;
		for(int i=1;i<n;++i)if(d[id2]<d[i]&&i!=id)id2=i;
		ans+=d[id2]-1;
		wr(ans),put('\n');
	}
    return 0;
}
2025/1/22 22:09
加载中...