图的遍历
# include <bits/stdc++.h>
# define rep ( i, a, b) for ( int i = ( a) ; i <= ( b) ; i++ )
# define per ( i, a, b) for ( int i = ( a) ; i >= ( b) ; i-- )
# define ll long long
# define db double
# define PII pair< int , int >
# define pi acos ( - 1.0 )
const int INF = 0x7fffffff ;
const int N = 2e5 + 5 ;
const db eps = 1e-10 ;
using namespace std;
int cas, n, a[ N] , ru[ N] , chu[ N] , ans = INF;
bool vis[ N] ;
int dfs ( int now, int begin) {
if ( a[ now] == begin) return 1 ;
chu[ now] -- ;
now = a[ now] ;
ru[ now] -- ;
if ( ! ru[ now] ) vis[ now] = 0 ;
return 1 + dfs ( now, begin) ;
}
int main ( ) {
ios:: sync_with_stdio ( 0 ) , cin. tie ( 0 ) , cout. tie ( 0 ) ;
cin >> n;
memset ( ru, 0 , sizeof ( ru) ) ;
memset ( chu, 0 , sizeof ( chu) ) ;
rep ( i, 1 , n) {
cin >> a[ i] ;
ru[ a[ i] ] ++ , chu[ i] ++ ;
vis[ i] = 1 ;
}
rep ( i, 1 , n) {
if ( ! vis[ i] ) continue ;
int now = i;
while ( ! ru[ now] ) {
chu[ now] -- , vis[ now] = 0 ;
now = a[ now] ;
ru[ now] -- ;
}
}
rep ( i, 1 , n) {
if ( ! vis[ i] ) continue ;
ans = min ( ans, dfs ( i, i) ) ;
}
cout << ans << endl;
}
# include <bits/stdc++.h>
# define rep ( i, a, b) for ( int i = ( a) ; i <= ( b) ; i++ )
# define per ( i, a, b) for ( int i = ( a) ; i >= ( b) ; i-- )
# define ll long long
# define PII pair< int , int >
const int N = 1e4 + 5 ;
using namespace std;
int m, n, vis[ N] , deep[ N] , flg = 1 , a[ N] , ans = 0 ;
vector< int > edge[ N] ;
int main ( ) {
ios:: sync_with_stdio ( 0 ) , cin. tie ( 0 ) , cout. tie ( 0 ) ;
cin >> n >> m;
memset ( a, 0 , sizeof ( a) ) ;
rep ( i, 1 , m) {
int x, y; cin >> x >> y;
edge[ x] . push_back ( y) , edge[ y] . push_back ( x) ;
a[ x] = 1 , a[ y] = 1 ;
}
memset ( vis, 0 , sizeof ( vis) ) ;
rep ( i, 1 , n) {
if ( vis[ i] ) continue ;
deep[ i] = 1 , vis[ i] = 1 ;
queue< int > record; record. push ( i) ;
queue< PII> q; q. push ( { i, 1 } ) ;
while ( q. size ( ) ) {
int tp = q. front ( ) . first, cnt = q. front ( ) . second;
q. pop ( ) ;
for ( auto nxt : edge[ tp] ) {
if ( vis[ nxt] ) {
if ( deep[ nxt] && deep[ nxt] == deep[ tp] ) {
puts ( "Impossible" ) ;
return 0 ;
}
}
else {
deep[ nxt] = cnt + 1 , vis[ nxt] = 1 ;
q. push ( { nxt, deep[ nxt] } ) , record. push ( nxt) ;
}
}
}
int odd = 0 , even = 0 ;
while ( record. size ( ) ) {
int tp = record. front ( ) ; record. pop ( ) ;
if ( deep[ tp] % 2 ) even++ ;
else odd++ ;
}
ans += min ( odd, even) ;
}
cout << ans << endl;
}
# include <bits/stdc++.h>
# define rep ( i, a, b) for ( int i = ( a) ; i <= ( b) ; i++ )
# define per ( i, a, b) for ( int i = ( a) ; i >= ( b) ; i-- )
# define all ( x) x. begin ( ) , x. end ( )
using namespace std;
int n, g[ 300 ] [ 300 ] ;
map< char , int > mp;
vector< char > tmp, ans;
void In ( char x) {
if ( mp. count ( x) ) mp[ x] ++ ;
else mp. insert ( { x, 1 } ) ;
}
void dfs ( char x) {
rep ( i, 65 , 122 ) {
if ( g[ x] [ i] ) {
g[ x] [ i] = g[ i] [ x] = 0 ;
dfs ( i) ;
}
}
ans. push_back ( x) ;
}
int main ( ) {
ios:: sync_with_stdio ( 0 ) , cin. tie ( 0 ) , cout. tie ( 0 ) ;
cin >> n;
memset ( g, 0 , sizeof ( g) ) ;
rep ( i, 1 , n) {
char x[ 5 ] ; cin >> x;
In ( x[ 0 ] ) , In ( x[ 1 ] ) ;
g[ x[ 0 ] ] [ x[ 1 ] ] = g[ x[ 1 ] ] [ x[ 0 ] ] = 1 ;
}
for ( auto now : mp)
if ( now. second % 2 ) tmp. push_back ( now. first) ;
if ( mp. size ( ) > n + 1 || tmp. size ( ) > 2 || tmp. size ( ) == 1 ) {
puts ( "No Solution" ) ;
return 0 ;
}
if ( ! tmp. size ( ) ) {
pair< char , int > head = * mp. begin ( ) ;
dfs ( head. first) ;
}
else dfs ( min ( tmp[ 0 ] , tmp[ 1 ] ) ) ;
reverse ( all ( ans) ) ;
rep ( i, 0 , ans. size ( ) - 1 ) cout << ans[ i] ;
}
# include <bits/stdc++.h>
# define rep ( i, a, b) for ( int i = ( a) ; i <= ( b) ; i++ )
# define per ( i, a, b) for ( int i = ( a) ; i >= ( b) ; i-- )
const int N = 1e5 + 5 ;
using namespace std;
int n, nxt[ N] , dfn[ N] , ans[ N] , Begin;
bool vis[ N] ;
int dfs ( int now, int cnt) {
if ( ans[ now] ) return cnt + ans[ now] - 1 ;
if ( vis[ now] ) {
Begin = now;
return ans[ now] = cnt - dfn[ now] ;
}
vis[ now] = 1 ;
dfn[ now] = cnt;
dfs ( nxt[ now] , cnt + 1 ) ;
if ( Begin) {
if ( now == Begin) Begin = 0 ;
else ans[ now] = ans[ nxt[ now] ] ;
}
else ans[ now] = ans[ nxt[ now] ] + 1 ;
vis[ now] = 0 ;
return ans[ now] ;
}
int main ( ) {
ios:: sync_with_stdio ( 0 ) , cin. tie ( 0 ) , cout. tie ( 0 ) ;
cin >> n;
rep ( i, 1 , n) cin >> nxt[ i] ;
rep ( i, 1 , n) cout << dfs ( i, 1 ) << endl;
}