#include<bits/stdc++.h>
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
typedef double db;
#define endl "\n"
#define ss second
#define ff first
#define all(x) (x).begin() , (x).end()
#define pb push_back
#define vi vector<int>
#define vii vector<pair<int,int>>
#define vl vector<ll>
#define vll vector<pair<ll,ll>>
#define pii pair<int,int>
#define pll pair<ll,ll>
#define pdd pair<double,double>
#define vdd vector<pdd>
#define speed ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
#define int ll
////////////////////Only Clear Code//////////////////////////
void init(){
#ifndef ONLINE_JUDGE
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
#endif // ONLINE_JUDGE
}
const int mx = 2e5+5;
const int LOG = 22;
const int inf = 1e9;
const ll mod = 998244353;
const int sq = 300;
vi graph[mx];
ll n;
ll sz[mx];
ll nb_leafs[mx];
bool leaf[mx];
ll totwin = 0, totleafs = 0;
bool winning[mx];
ll ans = 0;
ll nbwin[mx];
void dfs(int node, int p){
sz[node] = 1;
nb_leafs[node] = 0;
for(int adj : graph[node]){
if(adj == p)continue;
dfs(adj, node);
sz[node] += sz[adj];
nb_leafs[node] += nb_leafs[adj];
}
if(sz[node] == 1){
// leaf
nb_leafs[node] = 1;
leaf[node] = 1;
}
}
void pre(int node, int p = -1){
if(leaf[node])return;
nbwin[node] = winning[node];
for(int adj : graph[node]){
if(adj == p)continue;
pre(adj, node);
nbwin[node] += nbwin[adj];
}
}
void dfs1(int node, int p = -1){
if(leaf[node])return;
for(int adj : graph[node]){
if(adj == p)continue;
dfs1(adj, node);
}
// go up
// p should be up
if(p != -1 && winning[p]){
ans += n - sz[node] - (totwin - nbwin[node]) - (totleafs - nb_leafs[node]);
}
// look down
for(int adj : graph[node]){
if(adj == p)continue;
if(winning[adj]){
ans += sz[adj] - nbwin[adj] - nb_leafs[adj];
}
}
}
void runcase(){
cin >> n;
ans = 0;
totwin = 0;
totleafs = 0;
for(int i = 1; i <= n;i++){
graph[i].clear();
sz[i] = 0;
nb_leafs[i] = 0;
winning[i] = leaf[i] = 0;
nbwin[i] = 0;
}
for(int i = 1; i < n;i++){
int u, v;cin >> u >> v;
graph[u].pb(v);
graph[v].pb(u);
}
int root = -1;
for(int i = 1; i <= n;i++){
if(graph[i].size() >= 2)root = i;
}
if(root == -1){
cout << 0 << endl;
return;
}
dfs(root, root);
ans = nb_leafs[root] * (n-nb_leafs[root]);
for(int i = 1; i <= n;i++){
for(int adj : graph[i]){
winning[i] |= leaf[adj];
}
if(leaf[i])winning[i] = 0;
totwin += winning[i];
totleafs += leaf[i];
}
pre(root);
dfs1(root);
cout << ans << endl;
}
int32_t main(){
init();
speed;
int t = 1;
cin >> t;
while(t--){
runcase();
}
}
/*
NEVER GIVE UP!
DOING SMTHNG IS BETTER THAN DOING NTHNG!!!
Your Guide when stuck:
- Continue keyword only after reading the whole input
- Don't use memset with testcases
- Check for corner cases(n=1, n=0)
- Check where you declare n(Be careful of declaring it globally and in main)
*/