#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;
vb used;
vi group;
ll ans=0;
void scan(int i){
used[i]=true;
group.pb(i);
for(auto x:g[i])if(!used[x.fi])scan(x.fi);
}
ll c,ce;
vi gv,ge,lk,ord;
vb back_edge;
void dfs(int i,int p,int e){
for(auto x:g[i]){
if(x.fi!=p){
if(ord[x.fi]==-1){
ord[x.fi]=c++;
dfs(x.fi,i,x.se);
chmin(lk[i],lk[x.fi]);
}
else{
chmin(lk[i],ord[x.fi]);
back_edge[x.se]=true;
}
}
}
}
void dfs1(int i,int p,int e){
vp dl;
for(auto x:g[i]){
if(!back_edge[x.se]&&x.fi!=p){
if(p!=-1){
if(lk[x.fi]>=ord[i]){
gv[i]=-1;
ge[x.se]=ce++;
// cout<<i<<' '<<x.se<<' '<<ge[x.se]<<endl;
}
else ge[x.se]=ge[e];
dfs1(x.fi,i,x.se);
}
else dl.pb(x);
}
else if(x.fi!=p&&ord[x.fi]<ord[i])ge[x.se]=ge[e];
}
if(p==-1){
for(auto x:dl){
ge[x.se]=ce++;
dfs1(x.fi,i,x.se);
}
if(dl.size()==1)gv[i]=0;
else gv[i]=-1;
}
else if(gv[i]==-2)gv[i]=ge[e];
}
vi f,sz,par;
vvi edge;
ll getsz(int i,int p){
par[i]=p;
if(i>=ce)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;cin>>n>>m;
g=vvp(n);
used=vb(n,false);
rep(i,m){
ll a,b;cin>>a>>b;a--;b--;
g[a].pb(b,i);g[b].pb(a,i);
}
lk=vi(n,inf);
gv=vi(n,-2);
ge=vi(m);
back_edge=vb(m,false);
ord=vi(n,-1);
rep(i,n){
if(used[i])continue;
group=vi(0);
scan(i);
if(group.size()<3)continue;
ord[i]=0;
c=1;
ce=0;
dfs(i,-1,-1);
// outv(lk);outv(ord);
dfs1(i,-1,-1);
ll cnt=0;
// outv(gv);outv(ge);
f=vi(ce);
for(ll x:group){
if(gv[x]==-1)gv[x]=ce+(cnt++);
else f[gv[x]]++;
}
edge=vvi(cnt+ce);
for(ll x:group){
if(gv[x]>=ce)for(auto to:g[x]){
edge[gv[x]].pb(ge[to.se]);
edge[ge[to.se]].pb(gv[x]);
}
}
rep(j,cnt+ce)dupli(edge[j]);
// out(ce);out(cnt);
// out("edge");
// outvv(edge);
// outv(f);
par=vi(ce+cnt);sz=vi(ce+cnt);
getsz(0,-1);
vi s(ce);
rep(i,ce){
for(ll x:edge[i])if(x!=par[i])s[i]+=sz[x]*(sz[x]-1);
ans+=f[i]*((group.size()-1)*(group.size()-2)-s[i]);
if(par[i]!=-1)ans-=f[i]*(group.size()-sz[i])*(group.size()-sz[i]-1);
// outp(P(i,ans));
}
// outv(s);
REP(i,ce,ce+cnt){
ans+=(group.size()-1)*(group.size()-2);
for(ll x:edge[i])if(x!=par[i])ans-=s[x];
// out(ans);
ll p=par[i];
ans-=(s[p]+(group.size()-sz[p])*(group.size()-sz[p]-1)-sz[i]*(sz[i]-1));
// outp(P(i,ans));
}
}
out(ans);
}
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
0 ms |
256 KB |
Output is correct |
2 |
Correct |
0 ms |
256 KB |
Output is correct |
3 |
Correct |
0 ms |
256 KB |
Output is correct |
4 |
Correct |
0 ms |
256 KB |
Output is correct |
5 |
Correct |
1 ms |
256 KB |
Output is correct |
6 |
Correct |
0 ms |
256 KB |
Output is correct |
7 |
Correct |
1 ms |
256 KB |
Output is correct |
8 |
Incorrect |
1 ms |
256 KB |
Output isn't correct |
9 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
0 ms |
256 KB |
Output is correct |
2 |
Correct |
0 ms |
256 KB |
Output is correct |
3 |
Correct |
0 ms |
256 KB |
Output is correct |
4 |
Correct |
0 ms |
256 KB |
Output is correct |
5 |
Correct |
1 ms |
256 KB |
Output is correct |
6 |
Correct |
0 ms |
256 KB |
Output is correct |
7 |
Correct |
1 ms |
256 KB |
Output is correct |
8 |
Incorrect |
1 ms |
256 KB |
Output isn't correct |
9 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
214 ms |
26076 KB |
Output is correct |
2 |
Correct |
185 ms |
25964 KB |
Output is correct |
3 |
Correct |
211 ms |
26088 KB |
Output is correct |
4 |
Correct |
188 ms |
25976 KB |
Output is correct |
5 |
Correct |
206 ms |
21088 KB |
Output is correct |
6 |
Correct |
209 ms |
24684 KB |
Output is correct |
7 |
Correct |
202 ms |
17968 KB |
Output is correct |
8 |
Correct |
230 ms |
20544 KB |
Output is correct |
9 |
Correct |
222 ms |
14480 KB |
Output is correct |
10 |
Correct |
217 ms |
15776 KB |
Output is correct |
11 |
Correct |
153 ms |
10488 KB |
Output is correct |
12 |
Correct |
133 ms |
10360 KB |
Output is correct |
13 |
Correct |
121 ms |
9976 KB |
Output is correct |
14 |
Correct |
122 ms |
9848 KB |
Output is correct |
15 |
Correct |
89 ms |
8696 KB |
Output is correct |
16 |
Correct |
85 ms |
8696 KB |
Output is correct |
17 |
Correct |
7 ms |
5120 KB |
Output is correct |
18 |
Correct |
10 ms |
4992 KB |
Output is correct |
19 |
Correct |
6 ms |
4992 KB |
Output is correct |
20 |
Correct |
7 ms |
5120 KB |
Output is correct |
21 |
Correct |
6 ms |
4992 KB |
Output is correct |
22 |
Correct |
7 ms |
4992 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
2 ms |
512 KB |
Output is correct |
2 |
Correct |
2 ms |
512 KB |
Output is correct |
3 |
Correct |
1 ms |
512 KB |
Output is correct |
4 |
Correct |
2 ms |
640 KB |
Output is correct |
5 |
Correct |
2 ms |
640 KB |
Output is correct |
6 |
Correct |
2 ms |
640 KB |
Output is correct |
7 |
Correct |
2 ms |
640 KB |
Output is correct |
8 |
Correct |
2 ms |
640 KB |
Output is correct |
9 |
Correct |
2 ms |
640 KB |
Output is correct |
10 |
Correct |
2 ms |
512 KB |
Output is correct |
11 |
Correct |
2 ms |
512 KB |
Output is correct |
12 |
Correct |
1 ms |
512 KB |
Output is correct |
13 |
Correct |
2 ms |
512 KB |
Output is correct |
14 |
Correct |
2 ms |
384 KB |
Output is correct |
15 |
Correct |
1 ms |
384 KB |
Output is correct |
16 |
Correct |
1 ms |
384 KB |
Output is correct |
17 |
Correct |
1 ms |
512 KB |
Output is correct |
18 |
Correct |
1 ms |
512 KB |
Output is correct |
19 |
Correct |
1 ms |
512 KB |
Output is correct |
20 |
Correct |
1 ms |
512 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
188 ms |
24624 KB |
Output is correct |
2 |
Correct |
188 ms |
24684 KB |
Output is correct |
3 |
Correct |
189 ms |
24556 KB |
Output is correct |
4 |
Correct |
186 ms |
24556 KB |
Output is correct |
5 |
Correct |
186 ms |
24448 KB |
Output is correct |
6 |
Correct |
226 ms |
34924 KB |
Output is correct |
7 |
Correct |
242 ms |
31208 KB |
Output is correct |
8 |
Correct |
216 ms |
29548 KB |
Output is correct |
9 |
Correct |
221 ms |
28016 KB |
Output is correct |
10 |
Correct |
190 ms |
19644 KB |
Output is correct |
11 |
Correct |
229 ms |
23020 KB |
Output is correct |
12 |
Correct |
219 ms |
15704 KB |
Output is correct |
13 |
Correct |
207 ms |
14732 KB |
Output is correct |
14 |
Correct |
157 ms |
10616 KB |
Output is correct |
15 |
Correct |
132 ms |
9976 KB |
Output is correct |
16 |
Correct |
88 ms |
8440 KB |
Output is correct |
17 |
Correct |
130 ms |
20840 KB |
Output is correct |
18 |
Correct |
133 ms |
20832 KB |
Output is correct |
19 |
Correct |
136 ms |
21072 KB |
Output is correct |
20 |
Correct |
140 ms |
20812 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
2 ms |
512 KB |
Output is correct |
2 |
Correct |
2 ms |
512 KB |
Output is correct |
3 |
Incorrect |
2 ms |
512 KB |
Output isn't correct |
4 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
212 ms |
24556 KB |
Output is correct |
2 |
Correct |
233 ms |
25100 KB |
Output is correct |
3 |
Incorrect |
279 ms |
24556 KB |
Output isn't correct |
4 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
0 ms |
256 KB |
Output is correct |
2 |
Correct |
0 ms |
256 KB |
Output is correct |
3 |
Correct |
0 ms |
256 KB |
Output is correct |
4 |
Correct |
0 ms |
256 KB |
Output is correct |
5 |
Correct |
1 ms |
256 KB |
Output is correct |
6 |
Correct |
0 ms |
256 KB |
Output is correct |
7 |
Correct |
1 ms |
256 KB |
Output is correct |
8 |
Incorrect |
1 ms |
256 KB |
Output isn't correct |
9 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
0 ms |
256 KB |
Output is correct |
2 |
Correct |
0 ms |
256 KB |
Output is correct |
3 |
Correct |
0 ms |
256 KB |
Output is correct |
4 |
Correct |
0 ms |
256 KB |
Output is correct |
5 |
Correct |
1 ms |
256 KB |
Output is correct |
6 |
Correct |
0 ms |
256 KB |
Output is correct |
7 |
Correct |
1 ms |
256 KB |
Output is correct |
8 |
Incorrect |
1 ms |
256 KB |
Output isn't correct |
9 |
Halted |
0 ms |
0 KB |
- |