# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
351249 | CaroLinda | Potemkin cycle (CEOI15_indcyc) | C++14 | 1109 ms | 195136 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 <bits/stdc++.h>
#define ll long long
#define sz(x) (int)(x.size())
#define all(x) x.begin(),x.end()
const int MAX = 1e6+10 ;
const int MAXN = 1010 ;
using namespace std ;
int N , M ;
int minDiff = MAX , lo = -1 , hi = -1 ;
vector<int> trash[MAXN] , adj[MAX] , revAdj[MAX] ;
int height[MAX] , par[MAX] , comp[MAX] ;
int code[MAXN][MAXN] ;
bool mat[MAXN][MAXN] ;
bool vis[MAX],isOn[MAX] ;
vector<int> List ;
void dfs1(int x)
{
vis[x] = true ;
for(auto e : adj[x] )
if(!vis[e] ) dfs1(e) ;
List.push_back(x) ;
}
void dfs2(int x )
{
for(auto e : revAdj[x] )
if(!comp[e])
{
comp[e] = comp[x] ;
dfs2(e) ;
}
}
void dfs3(int x , int depth )
{
height[x] = depth ;
isOn[x] = true ;
for(auto e : adj[x] )
{
if( comp[e] != comp[x] || e == par[x] ) continue ;
if( height[e] )
{
if( isOn[e] && height[x] - height[e] < minDiff )
{
minDiff = height[x] - height[e] ;
lo = x ;
hi = e ;
}
continue ;
}
par[e] = x ;
dfs3(e,depth+1) ;
}
isOn[x] = false ;
}
int main()
{
scanf("%d %d", &N, &M ) ;
for(int i = 0 , u , v ; i < M ; i++ )
{
scanf("%d %d", &u, &v ) ;
--u ; --v ;
mat[u][v] = mat[v][u] = true ;
trash[u].push_back(v) ;
trash[v].push_back(u) ;
}
for(int i = 0 , c = 0 ; i < N ; i++ )
for(int j = 0 ; j < N ; j++ , c++ ) code[i][j] = c ;
for(int i = 0 ; i < N ; i++ )
for(int j = 0 ; j < N ; j++ )
{
if( i == j || !mat[i][j] ) continue ;
for(auto k : trash[j] )
{
if(mat[i][k] || i == k) continue ;
adj[ code[i][j] ].push_back( code[j][k] ) ;
revAdj[ code[j][k] ].push_back(code[i][j] ) ;
}
}
for(int i = 0 ; i < N ; i++ )
for(int j= 0 ; j < N ; j++ )
{
if( i == j || vis[ code[i][j] ] ) continue ;
dfs1(code[i][j] ) ;
}
for(int i = sz(List)-1 ,c = 0 ; i >= 0 ; i-- )
{
if(comp[ List[i] ] ) continue ;
comp[ List[i] ] = ++c ;
dfs2(List[i] ) ;
}
for(int i = 0 ; i <= code[N-1][N-1] ; i++ ) vis[i] = false ;
for(int e : List )
{
if(vis[ comp[e] ] ) continue ;
vis[ comp[e] ] = true ;
dfs3(e, 1) ;
if(lo != -1 ) break ;
}
if( lo == -1 )
{
printf("no\n") ;
return 0 ;
}
set<int> s ;
while(lo != par[hi] )
{
s.insert( lo%N ) ;
s.insert(lo/N ) ;
lo = par[lo] ;
}
vector<int> ans ;
int x = *s.begin() ;
while(sz(s) )
{
s.erase(s.find(x) ) ;
ans.push_back(x) ;
for(auto e : trash[x] )
if( s.find(e) != s.end() )
{
x = e;
break ;
}
}
for(auto e : ans ) printf("%d ", e+1 ) ;
printf("\n" ) ;
}
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... |
# | 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... |