Submission #59321

#TimeUsernameProblemLanguageResultExecution timeMemory
59321wjoaoDuathlon (APIO18_duathlon)C++11
25 / 100
54 ms1736 KiB
#include<bits/stdc++.h> #define maxn 10010 #define ll long long using namespace std; vector<ll> g[maxn]; ll n, m, a, b, t=1, tempo_atual, tempo[maxn], sol, grupo[maxn], filhos[maxn], filhos_fora_grupo[maxn], filhos_grupo[maxn], mark[maxn]; void dfs(int v, int p){ tempo[v] = tempo_atual++; int grupo_achado = 0; filhos[v] = 1; filhos_fora_grupo[v] = 1; for(int i = 0; i < g[v].size(); i++){ int u = g[v][i]; if( u == p ) continue; if( tempo[u] > 0 && grupo[u] != 0 && tempo[u] < tempo[v] ){ grupo_achado = grupo[u]; continue; } if( tempo[u] > 0 ) continue; dfs(u, v); if( grupo[u] ){ grupo_achado = grupo[u]; }else{ filhos_fora_grupo[v] += filhos[u]; } filhos[v] += filhos[u]; } grupo[v] = grupo_achado; } void solve_group(int v, int _grupo){ mark[v] = true; for(int i = 0; i < g[v].size(); i++){ int u = g[v][i]; if(mark[u]) continue; if(grupo[u] == _grupo){ solve_group(u, _grupo); } } // cout << "solve_group v: " << v << " QUantidade de filhos do grupo " << filhos_grupo[_grupo] << " filhos fora do grupo: " << filhos_fora_grupo[v] << endl; sol += (filhos_grupo[_grupo]-filhos_fora_grupo[v])*filhos_fora_grupo[v]; } void solve_c(int c){ // cout << endl << endl << "===> SOLVE: " << c << endl; memset(tempo, 0, sizeof tempo); memset(grupo, 0, sizeof grupo); tempo_atual = 1; tempo[c] = tempo_atual++; int grupo_atual = 0; filhos[c] = 0; vector<int> componentes; for(int i = 0; i < g[c].size(); i++){ int u = g[c][i]; if(grupo[u] != 0) continue; grupo[c] = ++grupo_atual; componentes.push_back(u); dfs(u, c); // cout << "Filhos de " << u << " são " << filhos[u] << endl; filhos_grupo[grupo_atual] = filhos[u]; filhos[c] += filhos[u]; } for(int i = 0; i < g[c].size(); i++){ int u = g[c][i]; // cout << "Grupo u: " << u << " é " << grupo[u] << endl; } // cout << "Raiz " << c << " Tem " << filhos[c] << " Filhos " << endl; for(int i = 0; i < componentes.size(); i++ ){ int u = componentes[i]; // cout << "Componente u: " << u << " Com filhos: " << filhos[u] << endl; sol += (filhos[c]-filhos[u])*filhos[u]; if(grupo[u] != 0){ memset(mark, 0, sizeof mark); mark[c] = true; solve_group(u, grupo[u]); } } } int main(){ scanf(" %lld %lld", &n, &m); for(int i = 0; i < m; i++){ scanf(" %lld %lld", &a, &b); g[a].push_back(b); g[b].push_back(a); } for(int i = 1; i <= n; i++){ solve_c(i); // cout << "i: " << i << " Sol após i: " << sol << endl; } printf("%lld\n", sol); return 0; }

Compilation message (stderr)

count_triplets.cpp: In function 'void dfs(int, int)':
count_triplets.cpp:19:22: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i = 0; i < g[v].size(); i++){
                    ~~^~~~~~~~~~~~~
count_triplets.cpp: In function 'void solve_group(int, int)':
count_triplets.cpp:44:22: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i = 0; i < g[v].size(); i++){
                    ~~^~~~~~~~~~~~~
count_triplets.cpp: In function 'void solve_c(int)':
count_triplets.cpp:68:22: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i = 0; i < g[c].size(); i++){
                    ~~^~~~~~~~~~~~~
count_triplets.cpp:78:22: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i = 0; i < g[c].size(); i++){
                    ~~^~~~~~~~~~~~~
count_triplets.cpp:79:13: warning: unused variable 'u' [-Wunused-variable]
         int u = g[c][i];
             ^
count_triplets.cpp:83:22: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i = 0; i < componentes.size(); i++ ){
                    ~~^~~~~~~~~~~~~~~~~~~~
count_triplets.cpp: In function 'int main()':
count_triplets.cpp:97:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf(" %lld %lld", &n, &m);
     ~~~~~^~~~~~~~~~~~~~~~~~~~~~
count_triplets.cpp:100:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf(" %lld %lld", &a, &b);
         ~~~~~^~~~~~~~~~~~~~~~~~~~~~
#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...