• <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>

            gzwzm06

              C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
              1 隨筆 :: 52 文章 :: 17 評論 :: 0 Trackbacks
            2-SAT 問題
            關鍵:建圖(建議先看趙爽的論文)
            #include <stdio.h>
            #include 
            <cstring>
            #include 
            <stack>
            using namespace std ;

            const int MAXN = 2005 ;

            struct Node{
                
            int ID; 
                Node 
            *next;
            }
            mapa[MAXN] ;

            Node gTemp[
            110001] ;
            int gPos = 0 ;


            int N , M ;    //點數 邊數
            int g_Pred[MAXN], g_Num[MAXN], SN, flag[MAXN] ;
            bool visited[MAXN];
            stack
            <int> g_Stack ;

            void Insert(int a, int b)

                Node 
            *= &gTemp[gPos++];
                p
            ->ID = b;
                p
            ->next = mapa[a].next;
                mapa[a].next 
            = p;
            }


            void Build( const int& a , const int& b, const int& c, const char* cmd )
            {
                
            if ( strcmp( cmd , "AND" ) == 0 )
                
            {
                    
            if ( c == 1 )
                    
            {
                        Insert( a 
            + N, a ) ;
                        Insert( b 
            + N, b ) ;
                    }

                    
            else {
                        Insert( a, b 
            + N ) ;
                        Insert( b, a 
            + N ) ;
                    }

                }

                
            else if ( strcmp( cmd , "OR" ) == 0 )
                
            {
                    
            if ( c == 1 )
                    
            {
                        Insert( a 
            + N , b ) ;
                        Insert( b 
            + N , a ) ;
                    }

                    
            else {
                        Insert( a, a 
            + N ) ;
                        Insert( b, b 
            + N ) ;
                    }

                }

                
            else if ( strcmp( cmd , "XOR" ) == 0 )
                
            {
                    
            if ( c == 1 )
                    
            {
                        Insert( a 
            + N , b ) ;
                        Insert( b 
            + N , a ) ;
                        Insert( b , a 
            + N ) ;
                        Insert( a , b 
            + N ) ;
                    }

                    
            else {
                        Insert( a 
            + N , b + N ) ;
                        Insert( b 
            + N , a + N ) ;
                        Insert( a , b ) ;
                        Insert( b , a ) ;
                    }

                }

            }


            int MIN( const int& a, const int& b )
            {
                
            return ( a < b ? a : b ) ;
            }


            // Tarjan算法 求SCC
            void StrongDFS( int v )
            {
                g_Pred[v] 
            = g_Num[v] = SN++ ;

                g_Stack.push( v ) ;

                Node 
            *ptr = mapa[v].next ;

                visited[v] 
            = true ;

                
            while ( ptr ){
                    
            if ( g_Num[ptr->ID] == 0 )
                    
            {
                        StrongDFS( ptr
            ->ID ) ;
                        g_Pred[v] 
            = MIN( g_Pred[v], g_Pred[ptr->ID] ) ;
                    }

                    
            else if ( g_Num[ptr->ID] < g_Num[v] && !visited[ptr->ID] )
                    
            {
                        g_Pred[v] 
            = MIN( g_Pred[v], g_Num[ptr->ID] ) ;
                    }


                    ptr 
            = ptr->next ;
                }

                
            if ( g_Pred[v] == g_Num[v] )
                
            {
                    
            int w = g_Stack.top() ;
                    g_Stack.pop() ;
                    
            while ( w != v )
                    
            {
                        flag[w] 
            = SN ;
                        w 
            = g_Stack.top() ;
                        g_Stack.pop() ;
                    }

                    flag[w] 
            = SN ;
                }

            }


            void StronglyCon()
            {
                
            int i ;

                memset(g_Num, 
            0sizeof(g_Num)) ;
                memset(visited, 
            0sizeof(visited)) ;
                memset(flag, 
            0sizeof(flag)) ;
                SN 
            = 1 ;

                
            for ( i = 0 ; i < N * 2 ; ++i )
                
            {
                    
            if ( g_Num[i] == 0 )
                        StrongDFS( i ) ;
                }

            }




            void Init()
            {
                gPos 
            = 0 ;

                
            int i ;

                
            for ( i = 0 ; i < MAXN ; ++i )
                
            {
                    mapa[i].next 
            = NULL ;
                }

                
            while ( !g_Stack.empty() )
                
            {
                    g_Stack.pop() ;
                }

            }



            int main()
            {
                
            int i , first , second , third ;
                
            char cmd[8] ;

                
            while ( scanf("%d %d"&N, &M) != EOF )
                
            {
                    
                    Init() ;

                    
            for ( i = 0 ; i < M ; ++i )
                    
            {
                        scanf(
            "%d %d %d %s"&first, &second, &third, &cmd) ;
                        Build( first, second, third, cmd ) ;
                    }


                    StronglyCon() ;

                    
            bool ans = true ;

                    
            for ( i = 0 ; i < N ; ++i )
                    
            {
                        
            if ( flag[i] == flag[i + N] )
                        
            {
                            ans 
            = false ;
                            
            break ;
                        }

                    }


                    
            if ( ans )
                    
            {
                        printf(
            "YES\n") ;
                    }

                    
            else {
                        printf(
            "NO\n") ;
                    }

                }

                
            return 0 ;
            }

            posted on 2008-10-30 23:26 閱讀(371) 評論(0)  編輯 收藏 引用 所屬分類: 圖論
            久久人妻AV中文字幕| 深夜久久AAAAA级毛片免费看| 亚洲а∨天堂久久精品9966| 亚洲国产日韩综合久久精品| 国产成人久久精品一区二区三区| 99久久er这里只有精品18| 狠狠色综合久久久久尤物| 国产一区二区久久久| 欧美精品一本久久男人的天堂| 激情五月综合综合久久69| 综合久久国产九一剧情麻豆| 国产福利电影一区二区三区,免费久久久久久久精 | 亚洲AV无码久久精品蜜桃| 99久久99这里只有免费费精品| 国产精品久久久久AV福利动漫| 久久最新免费视频| 精品久久久久久久| 亚洲伊人久久大香线蕉综合图片 | 国产国产成人久久精品| 一本久久a久久精品亚洲| 国产国产成人久久精品| 一本色道久久HEZYO无码| 久久久久久噜噜精品免费直播 | 久久这里有精品视频| 伊人久久大香线蕉av不卡| 很黄很污的网站久久mimi色| 久久天堂AV综合合色蜜桃网| 久久久久国产精品嫩草影院| 久久影院午夜理论片无码| 久久91这里精品国产2020| 91精品国产高清91久久久久久| 久久久精品国产免大香伊 | 狠狠色丁香婷综合久久| 人妻少妇久久中文字幕 | 狠狠色综合网站久久久久久久高清| 国产福利电影一区二区三区久久老子无码午夜伦不 | 久久婷婷五月综合97色直播| 久久亚洲高清综合| 久久综合狠狠综合久久激情 | 欧美国产成人久久精品| 久久综合亚洲色一区二区三区|