# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
758671 | boris_mihov | Simurgh (IOI17_simurgh) | C++17 | 71 ms | 4004 KiB |
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 "simurgh.h"
#include <algorithm>
#include <iostream>
#include <numeric>
#include <cassert>
#include <vector>
#include <set>
typedef long long llong;
const int MAXN = 500 + 10;
const int INF = 1e9;
int n, m;
int timer;
int inComp[MAXN];
std::set <int> s;
std::vector <int> ans;
std::vector <int> spanning;
std::vector <std::pair <int,int>> edges;
std::vector <std::pair <int,int>> g[MAXN];
void dfs(int node)
{
inComp[node] = timer;
for (const auto &[i, idx] : g[node])
{
if (inComp[i] == 0)
{
spanning.push_back(idx);
dfs(i);
}
}
}
std::vector <int> find_roads(int N, std::vector <int> u, std::vector <int> v)
{
n = N;
m = u.size();
for (int i = 0 ; i < m ; ++i)
{
g[u[i] + 1].push_back({v[i] + 1, i});
g[v[i] + 1].push_back({u[i] + 1, i});
}
int last = -1;
int res = -1;
for (int i = 1 ; i <= n ; ++i)
{
timer = 0;
spanning.clear();
std::fill(inComp + 1, inComp + 1 + n, 0);
inComp[i] = -1;
for (int j = 1 ; j <= n ; ++j)
{
if (inComp[j] != 0)
{
continue;
}
timer++;
dfs(j);
}
std::sort(g[i].begin(), g[i].end(), [&](auto x, auto y)
{
return inComp[x.first] < inComp[y.first];
});
int curr = spanning.size();
for (int j = 0 ; j < g[i].size() ; ++j)
{
if (j == 0 || inComp[g[i][j - 1].first] < inComp[g[i][j].first])
{
spanning.push_back(g[i][j].second);
}
}
for (int j = 0 ; j <= g[i].size() ; ++j)
{
if (j == g[i].size() || (j > 0 && inComp[g[i][j - 1].first] < inComp[g[i][j].first]))
{
if (edges.size())
{
std::sort(edges.begin(), edges.end(), [&](auto x, auto y)
{
return x.second < y.second;
});
ans.push_back(edges.back().first);
// std::cout << "in for: " << edges.back().first << ' ' << edges.back().second << '\n';
for (int k = (int)edges.size() - 2 ; k >= 0 ; --k)
{
if (edges[k].second != edges[k + 1].second)
{
// std::cout << "break: " << edges[k].second << ' ' << edges[k + 1].second << '\n';
break;
}
// std::cout << "in for: " << edges[k].first << ' ' << edges[k].second << ' ' << edges[k + 1].second << '\n';
ans.push_back(edges[k].first);
}
}
curr++;
edges.clear();
if (j == g[i].size())
{
break;
}
}
spanning[curr] = g[i][j].second;
res = count_common_roads(spanning);
// std::cout << "push: " << edges.size() << ' ' << g[i][j].second << ' ' << res << '\n';
edges.push_back({g[i][j].second, res});
}
}
for (const int &i : ans)
{
s.insert(i);
}
ans.clear();
for (const int &i : s)
{
ans.push_back(i);
}
return ans;
}
Compilation message (stderr)
# | 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... |