ural Bus Routes(dfs深搜)
题意:一个城市有N条公交线路,每条线路都是一个环,现在想将这些公交线路合成一条,问能不能合成一个环。
思路:因为现在的每条公交线路已经是一个环了,只要两个环之间有一个公共点,就能从这个环到另一个环,但是有图不连通的情况,这种情况下直接输出0。这个有点坑人,明明给出的数据范围很大,但其实后台数据应该没那么大,如果 用数组会超内存,但有vector就不会,应该是测试数据范围比给出的要小。
代码:
View Code
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <iostream> #include <algorithm> #include <queue> #include <math.h> #include <map> #include <stack> #include <vector> #define N 10004 #define M 100005 using namespace std ; vector<int>p[N] ; vector<int>q ; vector<bool>vist[N] ; int n , sum ; void init() { for( int i = 0 ; i < N ; i++ ) { p[i].clear() ; vist[i].clear() ; } q.clear(); sum = 0 ; } void dfs( int x , int id ) { for ( int i = 0 ; i < p[x].size() ; i++ ) { if ( !vist[x][i] ) { vist[x][i] = true ; q.insert( q.begin() + id , p[x][i] ) ; dfs( p[x][i] , id + 1 ) ; } } } int main() { int m , i , j , x , y , s ; init() ; s = M ; cin>>n ; for ( i = 1 ; i <= n ; i++ ) { cin>>m>>x ; sum += m ; if ( x < s ) s = x ; for ( j = 1 ; j <= m ; j ++ ) { cin>>y ; p[x].push_back( y ) ; vist[x].push_back( false ) ; if ( y < s ) s = y ; x = y ; } } q.push_back( s ) ; dfs( s , 1 ); if( sum != q.size() - 1) { printf ( "0\n" ) ; } else { cout<<sum ; for( i = 0 ; i < q.size() ; i++ ) { cout<<" "<<q[i]; } cout<<endl ; } return 0 ; }