#include <bits/stdc++.h>
#include "keys.h"
using namespace std;
const int maxn=3*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[maxn];
int k[maxn];
int bg;
bool f;
vector<int> e[maxn], u;
int l[maxn],done[maxn];
int fl(int x)
{
if(l[x]==x)return x;
return l[x]=fl(l[x]);
}
void dfs(int i)
{
if(f)return;
int x=fl(i);
if(x!=bg)
{
//cout<<i<<" ! "<<bg<<endl;
f=1;
done[x]=1;
l[bg]=x;
return;
}
//cout<<i<<endl;
cnt++;
in[k[i]]=1;
used[i]=1;
u.push_back(i);
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
{
u.push_back(nb.second);
e[nb.second].push_back(nb.first);
}
}
}
vector<int> p;
void dfs1(int i)
{
if(fl(i)==bg)p.push_back(i);
//cout<<"- "<<bg<<" "<<i<<" "<<cnt<<endl;
cnt++;
in[k[i]]=1;
used[i]=1;
u.push_back(i);
for(int j=0; j<e[k[i]].size(); j++)
{
int nb=e[k[i]][j];
if(used[nb])continue;
dfs1(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])dfs1(nb.first);
else
{
u.push_back(nb.second);
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)
{
for(int i=0; i<R.size(); i++)
k[i]=R[i],l[i]=i;
for(int i=0; i<U.size(); i++)
ae(U[i],V[i],C[i]);
for(int j=0; j<=3; j++)
{
memset(done,0,sizeof(done));
for(int i=0; i<R.size(); i++)
{
if(done[i]||fl(i)!=i)continue;
//cout<<i<<"!"<<endl;
bg=i;
dfs(i);
for(int x=0;x<u.size();x++)
{
in[k[u[x]]]=used[u[x]]=0;
e[u[x]].clear();
}
u.clear();
f=0;
}
}
vector<int> ans;
int minn=R.size();
for(int i=0;i<R.size();i++)
{
if(fl(i)==i)
{
bg=i;
cnt=0;
dfs1(i);
if(cnt<minn)
{
minn=cnt;
ans=p;
}
else if(cnt==minn)
{
for(int j=0;j<p.size();j++)
ans.push_back(p[j]);
}
for(int x=0;x<u.size();x++)
{
in[k[u[x]]]=used[u[x]]=0;
e[u[x]].clear();
}
u.clear();
/*cout<<bg<<" "<<cnt<<endl;
for(int x=0;x<p.size();x++)
cout<<p[x]<<" ";
cout<<endl;*/
p.clear();
}
}
vector<int> h=ans;
ans.clear();
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;
}
/*
6 8
1 0 1 1 1 0
0 1 0
0 2 1
0 3 1
0 5 0
1 2 1
2 4 0
3 4 1
4 5 0
*/
# | 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... |