• <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 ;    //點(diǎn)數(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 閱讀(364) 評論(0)  編輯 收藏 引用 所屬分類: 圖論
            久久精品国产清自在天天线| 久久婷婷五月综合国产尤物app| 久久免费美女视频| 97精品伊人久久久大香线蕉| 久久久久人妻一区精品| 亚洲精品美女久久久久99| 国产福利电影一区二区三区久久久久成人精品综合 | 久久久这里只有精品加勒比| 亚洲国产精品无码成人片久久| 99久久夜色精品国产网站| 精品国产99久久久久久麻豆| 91精品国产91热久久久久福利 | 久久国产精品久久久| 亚洲国产精品狼友中文久久久| 99精品久久精品一区二区| 亚洲级αV无码毛片久久精品| 久久国产精品波多野结衣AV| 高清免费久久午夜精品| 精产国品久久一二三产区区别 | 久久综合综合久久综合| 97视频久久久| 久久露脸国产精品| 国内精品久久久久久久久| 国内精品久久久久影院一蜜桃| 中文字幕精品久久| 亚洲精品无码久久不卡| 女同久久| 亚洲婷婷国产精品电影人久久| 夜夜亚洲天天久久| 青青青青久久精品国产| 久久精品国产亚洲77777| 欧美亚洲色综久久精品国产| 欧美日韩精品久久久久| 一本一道久久a久久精品综合| 久久精品国产亚洲av瑜伽| 国产精品青草久久久久福利99| 久久99精品国产| 中文字幕一区二区三区久久网站| 国产精品99久久精品| 久久久久国产精品| 国产福利电影一区二区三区久久久久成人精品综合 |