제출 #1268281

#제출 시각아이디문제언어결과실행 시간메모리
1268281Sofiatpc철인 이종 경기 (APIO18_duathlon)C++20
100 / 100
78 ms29764 KiB
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
const int MAXN = 1e5+5, MAX = 16;
vector<int> adj[MAXN], bl[2*MAXN];
int dist[MAXN], low[MAXN], c[MAXN], rz, nxt, n;
ll ans, sub[2*MAXN], tam;

void dfs(int s, int p){
    low[s] = dist[s];

    for(int viz : adj[s]){
        if(viz == p)continue;

        if(dist[viz])low[s] = min(low[s],dist[viz]);
        else{
            dist[viz] = dist[s]+1;
            dfs(viz,s);
            low[s] = min(low[s],low[viz]);
        }
    }
}

void dfs2(int s){
    tam++;
    bl[c[s]].push_back(s); bl[s].push_back(c[s]);

    int f = 0;
    for(int viz : adj[s]){
        if(c[viz])continue;
        f++;

        if( (s == rz && f > 1) || (s != rz && low[viz] >= dist[s])){
            bl[nxt].push_back(s); bl[s].push_back(nxt);
            c[viz] = nxt++;
        }else c[viz] = c[s];
        dfs2(viz);
    }
}

void dfsbl(int s, int p){
    ll val;
    if(s <= n)val = 1;
    else val = bl[s].size()-2;

    for(int viz : bl[s]){
        if(viz == p)continue;
        
        dfsbl(viz,s);
        ans += val*(sub[viz])*(tam-sub[viz] -(s<=n) );
        sub[s] += sub[viz];
    }

    ans += val*(tam-sub[s] -(s<=n) )*sub[s];

    if(s <= n)sub[s]++;
}

int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);

    int m; cin>>n>>m;
    for(int i = 1; i <= m; i++){
        int a,b; cin>>a>>b;
        adj[a].push_back(b);
        adj[b].push_back(a);
    }

    for(int i = 1; i <= n; i++)
        if(dist[i] == 0){
            dist[i] = 1;
            dfs(i,0);
        }

    nxt = n+1;
    for(int i = 1; i <= n; i++)
        if(c[i] == 0){
            rz = i;
            c[i] = nxt++;
            tam = 0;
            dfs2(i);

            dfsbl(i,0);
        }
    
    cout<<ans<<"\n";
}

#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...