• <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++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
              1 隨筆 :: 52 文章 :: 17 評論 :: 0 Trackbacks
            2-SAT 問題
            關(guān)鍵:建圖(建議先看趙爽的論文)
            #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 ;    //點數(shù) 邊數(shù)
            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 閱讀(365) 評論(0)  編輯 收藏 引用 所屬分類: 圖論
            热RE99久久精品国产66热| 色诱久久久久综合网ywww| 久久久精品国产sm调教网站| 欧美精品丝袜久久久中文字幕 | 欧美成人免费观看久久| 久久久久久久综合日本| 久久99精品久久久久久水蜜桃| 狠狠久久综合伊人不卡| 久久久精品久久久久特色影视| 久久99精品久久久久久9蜜桃| 久久国产精品免费一区| 久久久久国产| 狠狠色丁香久久婷婷综合蜜芽五月 | 亚洲精品无码久久久影院相关影片 | 久久久久99精品成人片牛牛影视 | 精品视频久久久久| 欧美精品丝袜久久久中文字幕 | 久久久久人妻一区精品| 久久综合成人网| 午夜精品久久久久久久| 久久午夜伦鲁片免费无码| 97久久超碰国产精品2021| 99久久伊人精品综合观看| 欧美久久亚洲精品| 婷婷久久香蕉五月综合加勒比| 99久久99这里只有免费的精品| 蜜桃麻豆www久久| 精品久久亚洲中文无码| 99国产欧美久久久精品蜜芽 | 国产精品久久波多野结衣| 精品国产综合区久久久久久 | 久久婷婷五月综合色高清| 亚洲国产精品久久久久网站| 亚洲国产精品一区二区三区久久| 精品久久久无码人妻中文字幕| 久久国产精品一区二区| 要久久爱在线免费观看| 99久久精品免费| 久久久久人妻精品一区二区三区| 久久精品免费大片国产大片| 久久综合香蕉国产蜜臀AV|