https://codeforc.es/contest/1454/problem/E
看样例就能看懂题意,就是找基环树的环,然而我环找错了。。。。。。
我是sb,我要学图!!!
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#include<stack>
using namespace std;
typedef long long ll;
const int maxn = 3e5+111;
vector<int>G[maxn];
void add(int be,int en){
G[be].push_back(en);
}
int vis[maxn];
stack<int>s;
vector<int>ins;
int dfs(int x,int fa){
if(vis[x]) {
if(ins.size() != 0) return 0;
while(s.size()){
ins.push_back(s.top());
if(s.top() == x) break;
s.pop();
}
return 0;
}
vis[x] = 1;
s.push(x);
for(int i=0;i<G[x].size();i++){
int p = G[x][i];
if(p == fa) continue;
dfs(p,x);
}
if(s.size()) s.pop();
return 0;
}
int cnt =0 ;
int dfs(int x){
if(vis[x]) return 0;
vis[x] = 1;
cnt++;
for(int i=0;i<G[x].size();i++){
dfs(G[x][i]);
}
return 0;
}
int f[maxn];
int main(){
int t;
cin>>t;
while(t--){
int n;
cin>>n;
while(s.size()) s.pop();
for(int i=1;i<=n+11;i++){
G[i].clear();
vis[i] = 0;
}
ins.clear();
for(int i=0;i<n;i++){
int be,en;
scanf("%d%d",&be,&en);
add(be,en);
add(en,be);
}
dfs(1,-1);
for(int i=1;i<=n;i++){
vis[i] = 0;
f[i] = 0;
}
for(int i=0;i<ins.size();i++){
f[ins[i]] = 1;
vis[ins[i]] = 1;
}
ll len = ins.size();
ins.clear();
for(int i=1;i<=n;i++){
if(f[i]){
vis[i] = 0;
cnt = 0;
dfs(i);
if(cnt != 1){
ins.push_back(cnt-1);
}
}
}
ll ans = 1LL*n*(n-1)/2;
ans += 1LL*len*(len-1)/2;
for(int i=0;i<ins.size();i++){
ans += 1LL*(ins[i]) *(n - ins[i]-1);
n -= ins[i];
// cout<<ins[i]<<endl;
}
printf("%lld
",ans);
}
return 0;
}
/*
20000
11
9 1
1 2
7 1
4 10
8 5
4 6
4 2
7 5
2 5
3 1
11 6
*/