• <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 閱讀(369) 評論(0)  編輯 收藏 引用 所屬分類: 圖論
            国产精品久久久久一区二区三区| 久久久噜噜噜久久| 一本色道久久综合狠狠躁| 日本精品久久久久影院日本| 精品久久亚洲中文无码| 久久久久久免费一区二区三区| 99久久无码一区人妻| 2021国内精品久久久久久影院| 久久99精品国产麻豆| 日韩精品无码久久一区二区三| 国产精品久久久久jk制服| 无码任你躁久久久久久久| 久久精品国产99久久无毒不卡 | 伊人久久综合热线大杳蕉下载| 久久国产热这里只有精品| 亚洲成色www久久网站夜月| 国产成人久久久精品二区三区| 亚洲精品美女久久777777| 久久婷婷五月综合色99啪ak| 99久久久精品| 无码精品久久久天天影视| 久久一区二区三区99| 国产成人精品久久一区二区三区av | 亚洲国产综合久久天堂| 亚洲人成伊人成综合网久久久| 国内精品久久久久久久久| 精品熟女少妇AV免费久久| 亚洲欧美精品一区久久中文字幕| 青草影院天堂男人久久| 色偷偷久久一区二区三区| 亚洲欧美一区二区三区久久| 精品国产一区二区三区久久蜜臀| 999久久久无码国产精品| 久久久久99这里有精品10| 激情综合色综合久久综合| 青青草国产精品久久久久| 蜜桃麻豆www久久| 99久久99久久精品国产片果冻| 国产精品美女久久久久网| 99久久久国产精品免费无卡顿| 久久精品国产只有精品2020|