Submission #766867

#TimeUsernameProblemLanguageResultExecution timeMemory
766867danikoynovSimurgh (IOI17_simurgh)C++14
51 / 100
86 ms1876 KiB
#include "simurgh.h"
#include <bits/stdc++.h>

using namespace std;

const int maxn = 510;
struct disjoint_set_union
{
    int par[maxn];

    disjoint_set_union(){};

    disjoint_set_union(int n)
    {
        for (int i = 0; i < n; i ++)
            par[i] = i;
    }

    int find_leader(int v)
    {
        if (v == par[v])
            return v;
        return (par[v] = find_leader(par[v]));
    }

    bool is_connected(int v, int u)
    {
        return find_leader(v) == find_leader(u);
    }

    void unite(int v, int u)
    {
        v = find_leader(v);
        u = find_leader(u);
        if (v == u)
            return;
        par[v] = u;
    }
};

int used[maxn * maxn];
vector<int> find_roads(int n, vector<int> u, vector<int> v) {
	vector < int > gold;
	int m = u.size();
	while(gold.size() < n - 1)
    {
        disjoint_set_union dsu(n);
        int cp = n;
        vector < int > res;
        for (int edge : gold)
        {
            dsu.unite(u[edge], v[edge]);
             cp --;
             res.push_back(edge);
        }
        for (int j = 0; j < m && cp > 2; j ++)
        {
            if (!dsu.is_connected(u[j], v[j]))
            {
                dsu.unite(u[j], v[j]);
                cp --;
                res.push_back(j);
            }
        }
        vector < pair < int, int > > pot;
        for (int i = 0; i < m; i ++)
        {
            if (!dsu.is_connected(u[i], v[i]) && !used[i])
            {
                used[i] = 1;
                pot.push_back({i, 0});
            }
        }

        int mx = -1, rd = -1;
        for (int i = 0; i < pot.size(); i ++)
        {
            res.push_back(pot[i].first);
            pot[i].second = count_common_roads(res);
            if (pot[i].second > mx)
            {
                mx = pot[i].second;
            }
            res.pop_back();
        }
        for (int i = 0; i < pot.size(); i ++)
        {
            if (pot[i].second == mx)
                gold.push_back(pot[i].first);
        }
    }
	return gold;
}

Compilation message (stderr)

simurgh.cpp: In function 'std::vector<int> find_roads(int, std::vector<int>, std::vector<int>)':
simurgh.cpp:45:20: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   45 |  while(gold.size() < n - 1)
      |        ~~~~~~~~~~~~^~~~~~~
simurgh.cpp:76:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   76 |         for (int i = 0; i < pot.size(); i ++)
      |                         ~~^~~~~~~~~~~~
simurgh.cpp:86:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   86 |         for (int i = 0; i < pot.size(); i ++)
      |                         ~~^~~~~~~~~~~~
simurgh.cpp:75:22: warning: unused variable 'rd' [-Wunused-variable]
   75 |         int mx = -1, rd = -1;
      |                      ^~
#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...