Submission #447676

#TimeUsernameProblemLanguageResultExecution timeMemory
447676blueKeys (IOI21_keys)C++17
37 / 100
3066 ms33848 KiB
#include <vector>
#include "keys.h"
#include <iostream>
#include <queue>
using namespace std;

vector<int> find_reachable(vector<int> r, vector<int> u, vector<int> v, vector<int> c)
{
	int N = r.size();
	int M = u.size();

	vector<int> reach_count(N, 0);

	vector<int> edge[N];
	vector<int> col[N];

	for(int j = 0; j < M; j++)
	{
		edge[ u[j] ].push_back( v[j] );
		col[ u[j] ].push_back( c[j] );

		edge[ v[j] ].push_back( u[j] );
		col[ v[j] ].push_back( c[j] );
	}

	cerr << "check\n";


	for(int src = 0; src < N; src++)
	{
		vector<int> acquired(N, 0);

		vector<int> illegal_edges[N]; //by color

		vector<int> visit(N, 0);

		queue<int> tbv;
		tbv.push(src);

		while(!tbv.empty())
		{
			int x = tbv.front();
			tbv.pop();

			if(visit[x]) continue;

			visit[x] = 1;

			acquired[ r[x] ] = 1;
			for(int f: illegal_edges[ r[x] ])
				tbv.push(f);
			illegal_edges[ r[x] ].clear();

			for(int e = 0; e < edge[x].size(); e++)
			{
				int y = edge[x][e];
				int z = col[x][e];

				if(acquired[z]) tbv.push(y);
				else illegal_edges[z].push_back(y);
			}
		}

		for(int i = 0; i < N; i++) reach_count[src] += visit[i];
	}

	cerr << "check 2\n";

	vector<int> res_list;
	int min_count = 1e9;
	for(int i = 0; i < N; i++)
	{
		if(reach_count[i] == min_count) res_list.push_back(i);
		else if(reach_count[i] < min_count)
		{
			min_count = reach_count[i];
			res_list.clear();
			res_list.push_back(i);
		}
	}

	cerr << "check 3\n";

	vector<int> res(N, 0);
	for(int r1: res_list) res[r1] = 1;

    // for(int i = 0; i < N; i++) cerr << "reach_count[" << i << "] = " << reach_count[i] << '\n';

	cerr << min_count << '\n';
	return res;
}

Compilation message (stderr)

keys.cpp: In function 'std::vector<int> find_reachable(std::vector<int>, std::vector<int>, std::vector<int>, std::vector<int>)':
keys.cpp:54:21: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   54 |    for(int e = 0; e < edge[x].size(); e++)
      |                   ~~^~~~~~~~~~~~~~~~
#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...