This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include<bits/stdc++.h>
#define ll long long
using namespace std;
#define pb push_back
const int N=100005,M=100005;
vector<int> g[N*2];
int hd[N],to[M],ne[M],num,n,m,siz[N*2];
int v[N],cnt,dc,dfn[N],low[N],nn;
ll ans=0;
struct lines{ int x,y;};
stack<lines> S;
inline void add(int x,int y){ to[++num]=y,ne[num]=hd[x],hd[x]=num;}
void tarjan(int x,int fa){
dfn[x] = low[x] = ++dc, nn++;
for(int i=hd[x]; i; i=ne[i]) if(to[i]!=fa)
if(!dfn[to[i]]){
S.push((lines){x,to[i]});
tarjan(to[i],x), low[x] = min(low[x], low[to[i]]);
if(low[to[i]] >= dfn[x]){
cnt++; lines e;
for(e=S.top(),S.pop();;e=S.top(),S.pop()){
if(v[e.x]!=cnt) v[e.x]=cnt, g[cnt].pb(e.x), g[e.x].pb(cnt);
if(v[e.y]!=cnt) v[e.y]=cnt, g[cnt].pb(e.y), g[e.y].pb(cnt);
if(e.x == x && e.y == to[i]) break;
}
}
}
else if(dfn[to[i]] < low[x]){
S.push((lines){x,to[i]});
low[x]=dfn[to[i]];
}
}
void dfs(int x,int fa){
if(x<=n){
for(int i:g[x]) if(i!=fa)
dfs(i,x), ans += siz[x] * (ll)siz[i], siz[x] += siz[i];
ans+=siz[x] * (ll)(nn - siz[x] - 1);
siz[x]++;
}
else{
int sz=g[x].size()-2;
for(int i:g[x]) if(i!=fa)
dfs(i,x), ans += siz[x] * (ll)siz[i] * (ll)sz, siz[x] += siz[i];
ans += siz[x] * (ll)(nn - siz[x]) * (ll)sz;
}
}
inline void solve(){
for(int i=1; i<=n; i++) if(!dfn[i]){
nn=0,tarjan(i,0);
dfs(i,0);
}
}
int main(){
scanf("%d %d", &n, &m); cnt=n;
for(int i=1,uu,vv;i<=m;i++){
scanf("%d %d", &uu, &vv);
add(uu,vv), add(vv,uu);
}
solve();
printf("%lld\n",ans<<1);
return 0;
}
Compilation message (stderr)
count_triplets.cpp: In function 'void tarjan(int, int)':
count_triplets.cpp:19:34: warning: suggest explicit braces to avoid ambiguous 'else' [-Wdangling-else]
for(int i=hd[x]; i; i=ne[i]) if(to[i]!=fa)
^
count_triplets.cpp: In function 'int main()':
count_triplets.cpp:62:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
scanf("%d %d", &n, &m); cnt=n;
~~~~~^~~~~~~~~~~~~~~~~
count_triplets.cpp:64:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
scanf("%d %d", &uu, &vv);
~~~~~^~~~~~~~~~~~~~~~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |