https://codeforces.com/problemset/problem/2053/E
#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
#define lowbit(x) x&(-x)
using ll = long long;
using pii = pair<int, int>;
const double PI = acos(-1);
const int N = 2e5 + 10;
const int mod = 1e9 + 7;
vector<ll> v[N];
bool st[N];
int in[N];//表示点的度
int adjv[N];//表示叶子结点的邻接点的个数
int ex[N];//表示*q的个数,实际要-1,因为q到*q,q占据的一个位置
void solve() {
ll n;cin>>n;
for(int i=1;i<=n;i++){
v[i].clear();
in[i]=0;
adjv[i]=0;
ex[i]=0;
st[i]=0;
}
for(int i=1;i<n;i++){
ll x,y;cin>>x>>y;
in[x]++;
in[y]++;
v[x].push_back(y);
v[y].push_back(x);
}
ll leaf=0;
for(int i=1;i<=n;i++){
if(in[i]==1) {
leaf++;
for(auto t:v[i]){
adjv[t]=1;
if(!st[t]){
for(auto x:v[t]){
if(in[x]>1){
// cout<<x<<" "<<in[x]<<endl;
ex[t]++;
}
}
st[t]=1;
}
}
}
}
// for(int i=1;i<=n;i++)
// cout<<i<<" "<<ex[i]<<endl;
ll ans=leaf*(n-leaf);
ll p=0;
for(int i=1;i<=n;i++){
if(in[i]!=1&&adjv[i]!=1) p++;//p可能的个数
}
for(int i=1;i<=n;i++){
ans+=max((ex[i]-1)*p,(ll)0);
}
cout<<ans<<endl;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr), cout.tie(nullptr);
int T = 1;
cin>>T;
while (T--) {
solve();
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库