Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- const int N = 10000000 + 5;
- set< pair< int, int > > st;
- int to[ N << 1 ], nxt[ N << 1 ], hd[ N ];
- bool vis[ N ];
- int from[ N ], qu[ N ], deg[ N ], sd[ N ];
- int main() {
- ios_base::sync_with_stdio( false );
- cin.tie( nullptr );
- memset( hd, -1, sizeof( hd ) );
- int n, m; cin >> n >> m;
- // 特判無解
- if ( m == 0 ) {
- cout << -1 << '\n';
- return 0;
- }
- // 讀入所有的邊
- for ( int i = 0 ; i < m ; ++ i ) {
- int u, v; cin >> u >> v;
- nxt[ i * 2 ] = hd[ u ];
- to[ i * 2 ] = v;
- hd[ u ] = i * 2;
- nxt[ i * 2 + 1 ] = hd[ v ];
- to[ i * 2 + 1 ] = u;
- hd[ v ] = i * 2 + 1;
- deg[ u ] ++, deg[ v ] ++;
- st.insert( minmax( u, v ) );
- }
- // 考慮每個連通塊
- for ( int i = 1 ; i <= n ; ++ i ) {
- // 有解就會結束,所以應該不能被遍歷過
- assert( not vis[ i ] );
- // 如果他沒有連其他人,那就可以考慮其他人
- if ( hd[ i ] == -1 ) {
- assert( deg[ i ] == 0 );
- continue;
- }
- // bfs整個連通塊,找到degree一樣的兩個點,放在r1跟r2裡
- int qs = 0, qe = 0;
- int r1 = -1, r2 = -1;
- qu[ qe ++ ] = i;
- vis[ i ] = true;
- while ( qs < qe ) {
- int u = qu[ qs ++ ];
- if ( sd[ deg[ u ] ] )
- r1 = u, r2 = sd[ deg[ u ] ];
- sd[ deg[ u ] ] = u;
- for ( int _ = hd[ u ] ; _ != -1 ; _ = nxt[ _ ] ) {
- if ( vis[ to[ _ ] ] ) continue;
- vis[ to[ _ ] ] = true;
- qu[ qe ++ ] = to[ _ ];
- }
- }
- // 理論上一定會找到解
- assert( r1 != -1 );
- // 重新以r1 bfs一次,找出r1->r2的一條路徑
- for ( int _ = 0 ; _ < qe ; ++ _ )
- vis[ qu[ _ ] ] = false;
- qs = 0, qe = 0;
- qu[ qe ++ ] = r1;
- vis[ r1 ] = true;
- while ( qs < qe ) {
- int u = qu[ qs ++ ];
- for ( int _ = hd[ u ] ; _ != -1 ; _ = nxt[ _ ] ) {
- if ( vis[ to[ _ ] ] ) continue;
- vis[ to[ _ ] ] = true;
- qu[ qe ++ ] = to[ _ ];
- from[ to[ _ ] ] = u;
- }
- }
- // 確實找出那條路徑
- vector< int > path;
- while( r2 != r1 ) {
- path.push_back( r2 );
- r2 = from[ r2 ];
- }
- path.push_back( r1 );
- // 確定自己走的路徑是合法的
- int xr = 0, la = -1;
- for ( size_t _ = 1 ; _ + 1 < path.size() ; ++ _ ) {
- cout << path[ _ ] << ' ';
- xr ^= deg[ path[ _ ] ];
- if ( la != -1 )
- assert( st.find( minmax( la, path[ _ ] ) ) != st.end() );
- la = path[ _ ];
- }
- for ( size_t _ = 1 ; _ <= path.size() ; ++ _ ) {
- cout << path[ path.size() - _ ] << " \n"[ _ == path.size() ];
- xr ^= deg[ path[ path.size() - _ ] ];
- if ( la != -1 )
- assert( st.find( minmax( la, path[ path.size() - _ ] ) ) != st.end() );
- la = path[ path.size() - _ ];
- }
- assert( xr == 0 );
- return 0;
- }
- // 無解應該要只有m==0的時候才會發生
- assert( false );
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement