• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            我希望你是我獨家記憶

            一段永遠封存的記憶,隨風而去
            posts - 263, comments - 31, trackbacks - 0, articles - 3
               :: 首頁 :: 新隨筆 ::  :: 聚合  :: 管理

            USACO——433——(刪除點)

            Posted on 2008-08-11 20:59 Hero 閱讀(120) 評論(0)  編輯 收藏 引用 所屬分類: 代碼如詩--ACM
            /*
            ID: wangzha4
            LANG: C++
            TASK: race3
            */
            /*
               Test 1: TEST OK [0.000 secs, 2732 KB]
               Test 2: TEST OK [0.000 secs, 2728 KB]
               Test 3: TEST OK [0.011 secs, 2728 KB]
               Test 4: TEST OK [0.011 secs, 2728 KB]
               Test 5: TEST OK [0.011 secs, 2728 KB]
               Test 6: TEST OK [0.011 secs, 2728 KB]
               Test 7: TEST OK [0.022 secs, 2732 KB]
               Test 8: TEST OK [0.011 secs, 2728 KB]
               Test 9: TEST OK [0.011 secs, 2728 KB]
               Test 10: TEST OK [0.011 secs, 2728 KB]
               Test 11: TEST OK [0.011 secs, 2728 KB]
            */

            //ques1 :-- 直接枚舉點,刪除,然后判斷能否從起點到終點
            //ques2 :-- 從ques1中的結果集out1[]中枚舉點,從起點到該點遍歷一遍,
            //          然后從該點到終點遍歷一遍,看是否有重復遍歷的點

            #include 
            <stdio.h>
            #include 
            <stdlib.h>
            #include 
            <string.h>
            #include 
            <ctype.h>
            #include 
            <math.h>
            #define llong unsigned long long 
            #define unint unsigned int
            #define printline  printf( "\n" ) 
            typedef 
            long long huge ;

            const int Base=1000000000;
            const int Capacity=100;
            const int INF = 1000000 ;
            const int size = 60 ;

            int edge[size][size] = {0} ;

            int inn ;//the max node
            int out1[size] = {0} ; 
            int out2[size] = {0} ;
            int flag[size] = {0} ;
            int flag2[size] = {0} ;

            bool hasfind ;

            void input()
            {
                
            int inval ;
                
            for( inn=0; ; inn++ ) 
                {
                    scanf( 
            "%d"&inval ) ;    if-1 == inval ) break ;
                    
            if-2 == inval )    continue ;
                    edge[inn][inval] 
            = 1 ;
                    
            while( scanf( "%d",&inval ) != EOF && inval != -2 ) 
                        edge[inn][inval] 
            = 1 ;
                }
                inn 
            -- ;
                
            //printf( "inn==%d\n", inn ) ;
            }

            void DFS1( int sn, int en )
            {
                
            if( sn == en ) { hasfind = true ; return ; }

                flag[sn] 
            = 1 ;

                
            forint i=0; i<=inn; i++ )
                {
                    
            if0==flag[i] && edge[sn][i] )
                    {
                        DFS1( i, en ) ;
                    }
                }
            }

            void deal_ques1()
            {
                
            int copyedgein[size] ; int copyedgeout[size] ;
                
            forint i=1; i<inn; i++ ) 
                {
            //刪除一個node,看能否從起點到達終點

                    memset( flag, 
            0sizeof(flag) ) ;

                    
            forint j=0; j<=inn; j++ )
                    {
                        copyedgein[j] 
            = edge[i][j] ;
                        edge[i][j] 
            = 0 ;
                    }
                    
            forint j=0; j<=inn; j++ ) 
                    {
                        copyedgeout[j] 
            = edge[j][i] ;
                        edge[j][i] 
            = 0 ;
                    }

                    hasfind 
            = false ;
                    DFS1( 
            0, inn ) ;
                    
            if!hasfind ) out1[++out1[0]] = i ;

                    
            forint j=0; j<=inn; j++ )    edge[i][j] = copyedgein[j] ;
                    
            forint j=0; j<=inn; j++ ) edge[j][i] = copyedgeout[j] ;
                }
            }

            void DFS2( int sn, int en )
            {
                flag2[sn] 
            = 1 ;
                
            forint i=0; i<=inn; i++ )
                    
            if( edge[sn][i] && 0==flag2[i] ) DFS2( i, en ) ;
            }

            void deal_ques2()
            {
                
            forint i=1; i<=out1[0]; i++ )
                {
                    memset( flag, 
            0sizeof(flag) ) ;
                    memset( flag2, 
            0sizeof(flag2) ) ;
                    
            int delnode = out1[i] ;

                    DFS2( delnode, inn ) ;
                    DFS1( 
            0, delnode ) ;

                    
            bool iskey = true ;
                    
            forint k=0; k<=inn; k++ )
                    {
                        
            if( flag[k]==1 && flag2[k]==1 )
                        { iskey 
            = false ; break ; }
                    }
                    
            if( iskey ) out2[++out2[0]] = delnode ;
                }
            }

            void process()
            {
                deal_ques1() ;

                deal_ques2() ;
            }

            int cmp( const void *a, const void *b )
            {
                
            return *(int *)a - *(int *)b ;
            }

            void output()
            {
                qsort( out1
            +1, out1[0], sizeof(out1[1]), cmp ) ;

                printf( 
            "%d", out1[0] ) ;
                
            forint i=1; i<=out1[0]; i++ )
                    printf( 
            " %d", out1[i] ) ;
                printf( 
            "\n" ) ;

                qsort( out2
            +1, out2[0], sizeof(out2[1]), cmp ) ;
                printf( 
            "%d", out2[0] ) ;
                
            forint i=1; i<=out2[0]; i++ )
                    printf( 
            " %d", out2[i] ) ;
                printf( 
            "\n" ) ;
            }

            int main()
            {
                
            //freopen( "race3.in", "r", stdin ) ;
                
            //freopen( "race3.out","w",stdout ) ;

                input() ;

                process() ;

                output() ;

                
            return 0 ;
            }
            久久99精品国产麻豆不卡| 亚洲AV伊人久久青青草原| 国产2021久久精品| 亚洲欧洲中文日韩久久AV乱码| 中文字幕无码av激情不卡久久| 精品国产VA久久久久久久冰| 久久国产免费直播| 久久人人爽人人爽人人AV| 国产精品va久久久久久久| 久久久久亚洲av无码专区导航| 久久免费观看视频| 久久er国产精品免费观看2| 久久精品国产亚洲AV不卡| 99久久综合狠狠综合久久| 亚洲国产欧洲综合997久久| 欧美一级久久久久久久大片| 青青草国产精品久久| 人妻无码中文久久久久专区| 欧美大战日韩91综合一区婷婷久久青草 | 国产成人精品久久亚洲高清不卡| 一级做a爰片久久毛片毛片| 久久青青草原精品影院| 欧美午夜精品久久久久免费视| 久久国产成人亚洲精品影院| 亚洲AV日韩精品久久久久久久| 久久久久亚洲精品无码网址| 狠狠色丁香久久综合五月| 久久精品国产精品亚洲毛片| 一本久道久久综合狠狠躁AV| 久久国产成人午夜aⅴ影院| 国产成人综合久久精品尤物| 97r久久精品国产99国产精| 久久综合狠狠综合久久| 亚洲精品美女久久久久99| 亚洲日韩中文无码久久| 国产成人久久精品一区二区三区| 久久人人爽人人爽人人片AV高清| 久久人人爽人人澡人人高潮AV | 久久久艹| 亚洲午夜精品久久久久久浪潮| 久久精品成人免费观看97|