• <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 閱讀(370) 評論(0)  編輯 收藏 引用 所屬分類: 圖論
            午夜人妻久久久久久久久| 久久99国产精品久久久| 久久er国产精品免费观看8| 久久线看观看精品香蕉国产| 日韩欧美亚洲综合久久影院d3| 国产精品xxxx国产喷水亚洲国产精品无码久久一区 | 欧美精品丝袜久久久中文字幕| 一本大道久久香蕉成人网| 中文字幕久久波多野结衣av| 久久99久久99小草精品免视看| 日韩美女18网站久久精品| 久久精品国产久精国产思思| 亚洲国产精品一区二区三区久久| 色综合久久久久久久久五月| 久久婷婷人人澡人人| 国内精品久久久久影院免费| 伊人久久大香线蕉综合网站| 国内精品欧美久久精品| 日本欧美久久久久免费播放网 | 久久一区二区三区免费| 久久91精品久久91综合| 99久久无色码中文字幕人妻| 精品久久久久久国产三级| 97久久超碰国产精品2021| 亚洲乱码精品久久久久..| 久久综合日本熟妇| 欧美无乱码久久久免费午夜一区二区三区中文字幕| 久久综合偷偷噜噜噜色| 亚洲国产成人久久精品99| 久久天天日天天操综合伊人av| 99久久精品国产一区二区蜜芽| 久久中文骚妇内射| 国产美女亚洲精品久久久综合| 中文字幕亚洲综合久久菠萝蜜| 久久国产香蕉一区精品| 国产成人久久777777| 国产成人精品久久亚洲高清不卡 国产成人精品久久亚洲高清不卡 国产成人精品久久亚洲 | 91麻豆精品国产91久久久久久| 久久精品国产只有精品2020| 久久国产乱子精品免费女| 狠狠色丁香婷婷综合久久来|