제출 #1202901

#제출 시각아이디문제언어결과실행 시간메모리
1202901simona1230열쇠 (IOI21_keys)C++20
37 / 100
3095 ms27040 KiB
#include <bits/stdc++.h>
#include "keys.h"
using namespace std;

const int maxn=2*1e5+5;
vector<pair<int,int> > v[maxn];

void ae(int i,int j,int z)
{
    v[i].push_back({j,z});
    v[j].push_back({i,z});
}

int cnt,used[maxn];
int in[2001];
int k[2001];

vector<int> e[maxn];
void dfs(int i)
{
    //cout<<i<<endl;
    cnt++;
    in[k[i]]=1;
    used[i]=1;
    for(int j=0;j<e[k[i]].size();j++)
    {
        int nb=e[k[i]][j];
        if(used[nb])continue;
        dfs(nb);
    }
    e[k[i]].clear();

    for(int j=0;j<v[i].size();j++)
    {
        pair<int,int> nb=v[i][j];
        if(used[nb.first])continue;

        if(in[nb.second])dfs(nb.first);
        else e[nb.second].push_back(nb.first);
    }
}

std::vector<int> find_reachable(std::vector<int> R, std::vector<int> U, std::vector<int> V, std::vector<int> C)
{
	vector<int> h;
	int minn=R.size();

	for(int i=0;i<R.size();i++)
        k[i]=R[i];

	for(int i=0;i<U.size();i++)
        ae(U[i],V[i],C[i]);
    for(int i=0;i<R.size();i++)
    {
        //cout<<i<<"!"<<endl;
        cnt=0;
        dfs(i);
        for(int j=0;j<R.size();j++)
        {
            used[j]=in[j]=0;
            e[j].clear();
        }

        if(cnt<minn)
        {
            minn=cnt;
            h={i};
        }
        else if(cnt==minn)
            h.push_back(i);
    }

    vector<int> ans;
    for(int i=0;i<R.size();i++)
        ans.push_back(0);
    for(int i=0;i<h.size();i++)
        ans[h[i]]=1;
    return ans;
}
#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...