Submission #407383

#TimeUsernameProblemLanguageResultExecution timeMemory
407383peuchSimurgh (IOI17_simurgh)C++17
0 / 100
1 ms460 KiB
#include "simurgh.h" #include<bits/stdc++.h> using namespace std; const int MAXN = 250; int n, m; vector<int> u, v; vector<int> ar[MAXN], id[MAXN]; int marc[MAXN]; int grp[MAXN * MAXN]; int rep[MAXN], tam[MAXN]; vector<int> getPath(int cur, int fim, int x); vector<int> getST(vector<int> base); bool uni(int a, int b); int find(int a); vector<int> find_roads(int _n, vector<int> _u, vector<int> _v) { n = _n; u = _u, v = _v; m = u.size(); for(int i = 0; i < u.size(); i++){ ar[u[i]].push_back(v[i]); id[u[i]].push_back(i); ar[v[i]].push_back(u[i]); id[v[i]].push_back(i); } for(int i = 0; i < u.size(); i++){ if(grp[i] != 0) continue; // printf("Calculating: %d\n", i); for(int j = 0; j < n; j++) marc[j] = 0; vector<int> path = getPath(u[i], v[i], i); if(path.empty()) { // printf("\tBridge\n"); grp[i] = 1; continue; } // printf("\tCycle: %d ", i); // for(int j = 0; j < path.size(); j++) // printf("%d ", path[j]); // printf("\n"); vector<int> cnt(path.size(), 0); vector<int> r = getST(path); path.push_back(i); int maxi = 0; for(int j = 0; j < path.size(); j++){ if(grp[path[j]] != 0) continue; vector<int> test = r; for(int k = 0; k < path.size(); k++) if(k != j) test.push_back(path[k]); cnt[j] = count_common_roads(test); maxi = max(maxi, cnt[j]); // printf("Tested: %d -> %d\n", path[j], cnt[j]); } for(int j = 0; j < path.size(); j++){ if(grp[path[j]] != 0) continue; if(cnt[j] == maxi) grp[path[j]] = -1; if(cnt[j] != maxi) grp[path[j]] = 1; } } vector<int> ans; for(int i = 0; i < m; i++) if(grp[i] == 1) ans.push_back(i); // for(int i = 0; i < ans.size(); i++){ // printf("%d ", ans[i]); // } // printf("\n"); return ans; } vector<int> getPath(int cur, int fim, int x){ marc[cur] = 1; vector<int> ret; for(int i = 0; i < ar[cur].size(); i++){ int viz = ar[cur][i]; if(marc[viz]) continue; if(id[cur][i] == x) continue; ret = getPath(viz, fim, x); if(ret.empty() && viz != fim) continue; ret.push_back(id[cur][i]); return ret; } return ret; } vector<int> getST(vector<int> base){ vector<int> ret; for(int i = 0; i < n; i++){ tam[i] = 1; rep[i] = i; } for(int i = 0; i < base.size(); i++) uni(u[base[i]], v[base[i]]); for(int i = 0; i < m; i++) if(uni(u[i], v[i])) ret.push_back(i); return ret; } bool uni(int a, int b){ a = find(a); b = find(b); if(a == b) return 0; if(tam[a] < tam[b]) swap(a, b); tam[a] += tam[b]; rep[b] = a; return 1; } int find(int a){ if(a == rep[a]) return a; return rep[a] = find(rep[a]); }

Compilation message (stderr)

simurgh.cpp: In function 'std::vector<int> find_roads(int, std::vector<int>, std::vector<int>)':
simurgh.cpp:25:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   25 |  for(int i = 0; i < u.size(); i++){
      |                 ~~^~~~~~~~~~
simurgh.cpp:32:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   32 |  for(int i = 0; i < u.size(); i++){
      |                 ~~^~~~~~~~~~
simurgh.cpp:56:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   56 |   for(int j = 0; j < path.size(); j++){
      |                  ~~^~~~~~~~~~~~~
simurgh.cpp:60:21: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   60 |    for(int k = 0; k < path.size(); k++)
      |                   ~~^~~~~~~~~~~~~
simurgh.cpp:68:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   68 |   for(int j = 0; j < path.size(); j++){
      |                  ~~^~~~~~~~~~~~~
simurgh.cpp: In function 'std::vector<int> getPath(int, int, int)':
simurgh.cpp:89:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   89 |  for(int i = 0; i < ar[cur].size(); i++){
      |                 ~~^~~~~~~~~~~~~~~~
simurgh.cpp: In function 'std::vector<int> getST(std::vector<int>)':
simurgh.cpp:107:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  107 |  for(int i = 0; i < base.size(); i++)
      |                 ~~^~~~~~~~~~~~~
#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...