#include <bits/stdc++.h>
using namespace std;
#define rep(i, n) for(long long i=0;i<(long long)(n);i++)
#define REP(i,k,n) for(long long i=k;i<(long long)(n);i++)
#define all(a) a.begin(),a.end()
#define pb emplace_back
#define eb emplace_back
#define lb(v,k) (lower_bound(all(v),k)-v.begin())
#define ub(v,k) (upper_bound(all(v),k)-v.begin())
#define fi first
#define se second
#define pi M_PI
#define PQ(T) priority_queue<T>
#define SPQ(T) priority_queue<T,vector<T>,greater<T>>
#define dame(a) {out(a);return 0;}
#define decimal cout<<fixed<<setprecision(15);
#define dupli(a) a.erase(unique(all(a)),a.end())
typedef long long ll;
typedef pair<ll,ll> P;
typedef tuple<ll,ll,ll> PP;
typedef tuple<ll,ll,ll,ll> PPP;
typedef multiset<ll> S;
using vi=vector<ll>;
using vvi=vector<vi>;
using vvvi=vector<vvi>;
using vvvvi=vector<vvvi>;
using vp=vector<P>;
using vvp=vector<vp>;
using vb=vector<bool>;
using vvb=vector<vb>;
const ll inf=1001001001001001001;
const ll INF=1001001001;
const ll mod=1000000007;
const double eps=1e-10;
template<class T> bool chmin(T&a,T b){if(a>b){a=b;return true;}return false;}
template<class T> bool chmax(T&a,T b){if(a<b){a=b;return true;}return false;}
template<class T> void out(T a){cout<<a<<'\n';}
template<class T> void outp(T a){cout<<'('<<a.fi<<','<<a.se<<')'<<'\n';}
template<class T> void outvp(T v){rep(i,v.size())cout<<'('<<v[i].fi<<','<<v[i].se<<')';cout<<'\n';}
template<class T> void outvvp(T v){rep(i,v.size())outvp(v[i]);}
template<class T> void outv(T v){rep(i,v.size()){if(i)cout<<' ';cout<<v[i];}cout<<'\n';}
template<class T> void outvv(T v){rep(i,v.size())outv(v[i]);}
template<class T> bool isin(T x,T l,T r){return (l)<=(x)&&(x)<=(r);}
template<class T> void yesno(T b){if(b)out("yes");else out("no");}
template<class T> void YesNo(T b){if(b)out("Yes");else out("No");}
template<class T> void YESNO(T b){if(b)out("YES");else out("NO");}
template<class T> void noyes(T b){if(b)out("no");else out("yes");}
template<class T> void NoYes(T b){if(b)out("No");else out("Yes");}
template<class T> void NOYES(T b){if(b)out("NO");else out("YES");}
void outs(ll a,ll b){if(a>=inf-100)out(b);else out(a);}
ll gcd(ll a,ll b){if(b==0)return a;return gcd(b,a%b);}
ll modpow(ll a,ll b){ll res=1;a%=mod;while(b){if(b&1)res=res*a%mod;a=a*a%mod;b>>=1;}return res;}
vvp g;
ll c,num;
vi id_ver,id_edge,lk,ord,tmp;
vb used,back_edge;
vi group;
void dfs(int i,int p){
used[i]=true;
group.pb(i);
ord[i]=c++;
lk[i]=ord[i];
for(auto x:g[i]){
if(x.fi!=p){
if(ord[x.fi]<ord[i])tmp.pb(x.se);
if(!used[x.fi]){
dfs(x.fi,i);
chmin(lk[i],lk[x.fi]);
if(lk[x.fi]>=ord[i]){
while(true){
id_edge[tmp.back()]=num;
bool done=false;
if(tmp.back()==x.se)done=true;
tmp.pop_back();
if(done)break;
}
num++;
}
}
else chmin(lk[i],ord[x.fi]);
}
}
}
vi f,sz,par;
vvi edge;
ll getsz(int i,int p){
par[i]=p;
if(i>=num)sz[i]=1;
else sz[i]=f[i];
for(ll x:edge[i])if(x!=p){
sz[i]+=getsz(x,i);
}
return sz[i];
}
int main(){
ll n,m,ans=0;cin>>n>>m;
g=vvp(n);
used=vb(n,false);
lk=vi(n,inf);
id_ver=vi(n,-2);
id_edge=vi(m);
back_edge=vb(m,false);
ord=vi(n,-1);
rep(i,m){
ll a,b;cin>>a>>b;a--;b--;
g[a].pb(b,i);g[b].pb(a,i);
}
rep(i,n){
if(used[i])continue;
tmp=vi(0);
group=vi(0);
c=0;num=0;
ll cnt=0;
dfs(i,-1);
if(group.size()<3)continue;
for(auto j:group){
ll t=id_edge[g[j][0].se];
for(auto x:g[j]){
if(t!=id_edge[x.se])id_ver[j]=num+(cnt++);
}
if(id_ver[j]==-2)id_ver[j]=t;
}
f=vi(num);
edge=vvi(num+cnt);
for(ll x:group){
if(id_ver[x]>=num)for(auto to:g[x]){
edge[id_ver[x]].pb(id_edge[to.se]);
edge[id_edge[to.se]].pb(id_ver[x]);
}
}
rep(j,cnt+num)dupli(edge[j]);
par=vi(num+cnt);sz=vi(num+cnt);
getsz(0,-1);
vi s(num);
rep(j,num){
for(ll x:edge[j])if(x!=par[j])s[j]+=sz[x]*(sz[x]-1);
ans+=f[j]*((group.size()-1)*(group.size()-2)-s[j]);
if(par[j]!=-1)ans-=f[j]*(group.size()-sz[j])*(group.size()-sz[j]-1);
}
REP(j,num,num+cnt){
ans+=(group.size()-1)*(group.size()-2);
for(ll x:edge[j])if(x!=par[j])ans-=s[x];
ll p=par[j];
ans-=(s[p]+(group.size()-sz[p])*(group.size()-sz[p]-1)-sz[j]*(sz[j]-1));
}
}
out(ans);
}
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
1 ms |
256 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
1 ms |
256 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
148 ms |
20596 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
2 ms |
512 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
189 ms |
26476 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
2 ms |
512 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
211 ms |
26476 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
1 ms |
256 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
1 ms |
256 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |