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


            May the force be with you!
            posts - 52,  comments - 33,  trackbacks - 0
                很久沒(méi)有在blog上寫(xiě)解題報(bào)告了。。。前一陣子都在看書(shū),看算導(dǎo),看中大的書(shū)。。。差點(diǎn)被認(rèn)為是沒(méi)有在做ACM了。。。怪我自己。
                在中大的書(shū)上看到一段寫(xiě)的不錯(cuò)的toplogical sort的代碼,用它來(lái)過(guò)了一直沒(méi)過(guò)的1094,后來(lái)看到kid的代碼,發(fā)現(xiàn)他寫(xiě)麻煩了。其實(shí)判環(huán)不用那么麻煩,在拓?fù)渑判蚶锞涂梢耘协h(huán)了。值得注意的是,每次刪點(diǎn)時(shí)都要判斷是否存在兩個(gè)或兩個(gè)以上的入度為0的點(diǎn),因?yàn)檫@樣是不能determin的。如果沒(méi)有這一步就會(huì)wa,比如如下數(shù)據(jù):
            4 5
            A<B
            C<D
            B<D
            A<C
            B<D
            若沒(méi)有那么做的話,會(huì)在輸出
            Sorted sequence determined after 4 relations:ACBD.
            但是實(shí)際上在第四步還沒(méi)有確定。

            代碼比kid的短,呵呵。
                                                    ——Simbaforrest

            代碼如下:
            #include<iostream>
            #include
            <cstring>
            using namespace std;
            int v,e;
            int deg[26];
            int sortAns[26],anstop;
            bool adj[
            26][26];

            int TopSort()
            {
              
            int ret=1;
              bool sure
            =true;
              
            //init
              memset(deg,0,sizeof(deg));
              
            //count degree
              for(int i=0; i<v; i++)
              {
                
            for(int j=0; j<v; j++)
                {
                  
            if(adj[i][j]==true)
                    
            ++deg[j];
                }
              }
              
            //make stack of 0 degree vertex
              int top=-1;
              
            int cnt=0;
              
            for(int i=0; i<v; i++)
              {
                
            if(deg[i]==0)
                {
                  
            ++cnt;
                  deg[i]
            =top;
                  top
            =i;
                }
              }
              
            if(cnt==0)
              {
                sure
            =true;
                
            return ret=-1;//cycle exist
              }
              
            if(cnt>1)
              {
                sure
            =false;
                ret
            =0;//unsure
              }//go on to see if cycle exist
              
              
            //sort
              anstop=-1;
              
            for(int i=0; i<v; i++)
              {
                
            if(top==-1)
                {
                  
            //cycle exist
                  sure=true;
                  
            return ret = -1;
                }
                
            else
                {
                  
            //find j as the 0 degree vertex
                  int j = top;
                  top 
            = deg[top];
                  sortAns[
            ++anstop]=j;//record the ans
                  
                  
            //delete the vertex j
                  cnt=0;
                  
            for(int ni=0; ni<v; ni++)
                  {
                    
            if(adj[j][ni]==true)
                    {
                      
            --deg[ni];
                      
            //a new 0 degree vertex
                      if(deg[ni]==0)
                      {
                        
            ++cnt;
                        deg[ni]
            =top;
                        top 
            = ni;
                      }
                    }
                  }
                  
            if(cnt>1)
                  {
                    sure
            =false;
                    ret
            =0;//unsure
                  }//go on to see if cycle exist
                }
              }
              
            if(sure==false)
                
            return ret=0;
              
            return ret;
            }

            int main()
            {
              
            while(cin>>v>>e,!(v==0&&e==0))
              {
                
            //init
                memset(adj,0,sizeof(adj));
                bool sure
            =false;
                
                
            //read and solve
                for(int i=0; i<e; i++)
                {
                  
            char left,op,right;
                  cin
            >>left>>op>>right;
                  adj[left
            -'A'][right-'A']=1;
                  
                  
            if(sure)
                    
            continue;
                    
                  
            int ret=TopSort();
                  
            if(ret!=0)
                  {
                    sure
            =true;
                    
            if(ret==1)
                    {
                      cout
            <<"Sorted sequence determined after "<<i+1<<" relations: ";
                      
            for(int j=0; j<=anstop; j++)
                        cout
            <<(char)(sortAns[j]+'A');
                      cout
            <<"."<<endl;
                    }
                    
            else if(ret==-1)
                    {
                      cout
            <<"Inconsistency found after "<<i+1<<" relations."<<endl;
                    }
                  }
                }
                
            if(sure==false)
                {
                  cout
            <<"Sorted sequence cannot be determined."<<endl;
                }
              }
              
            return 0;
            }



            posted on 2008-05-15 12:13 R2 閱讀(1459) 評(píng)論(3)  編輯 收藏 引用 所屬分類(lèi): Problem Solving

            FeedBack:
            # re: 再談Toplogical sort(pku 1094)
            2009-01-25 01:23 | 風(fēng)之傷
            配上注釋后,相當(dāng)清晰。謝謝大大~~  回復(fù)  更多評(píng)論
              
            # re: 再談Toplogical sort(pku 1094)
            2010-03-06 11:04 | Cinderella
            請(qǐng)問(wèn)一下 中大的書(shū)是哪本書(shū)  回復(fù)  更多評(píng)論
              
            # re: 再談Toplogical sort(pku 1094)
            2010-03-06 13:09 | R2
            @Cinderella
            中山大學(xué)郭嵩山老師的《國(guó)際大學(xué)生程序設(shè)計(jì)競(jìng)賽例題解》  回復(fù)  更多評(píng)論
              
            你是第 free hit counter 位訪客




            <2025年8月>
            272829303112
            3456789
            10111213141516
            17181920212223
            24252627282930
            31123456

            常用鏈接

            留言簿(4)

            隨筆分類(lèi)(54)

            隨筆檔案(52)

            文章檔案(1)

            ACM/ICPC

            技術(shù)綜合

            最新隨筆

            搜索

            •  

            積分與排名

            • 積分 - 64173
            • 排名 - 357

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            99精品久久精品一区二区| 久久午夜夜伦鲁鲁片免费无码影视 | 精品综合久久久久久98| 99久久综合狠狠综合久久止| 欧美精品福利视频一区二区三区久久久精品 | 久久国产精品-久久精品| 欧美久久久久久午夜精品| 日本精品久久久久久久久免费| 国产激情久久久久久熟女老人| 久久99国产精品久久久| 亚洲AV无一区二区三区久久| 久久久久国产精品三级网| 国产精品无码久久久久久| 欧美日韩精品久久久久 | 国产午夜精品久久久久免费视| 久久精品国产亚洲Aⅴ香蕉| 久久夜色精品国产欧美乱| 久久亚洲天堂| 久久精品国产亚洲5555| 久久久久夜夜夜精品国产| www性久久久com| 色婷婷综合久久久久中文| 久久婷婷色综合一区二区| 久久久久国产精品麻豆AR影院 | 91秦先生久久久久久久| 国内精品久久人妻互换| 久久久久亚洲精品无码蜜桃| 亚洲国产精品无码久久久秋霞2 | 久久强奷乱码老熟女网站| 国产精品熟女福利久久AV | 久久婷婷五月综合色奶水99啪| 久久中文字幕视频、最近更新| 精品国产青草久久久久福利 | 伊人久久一区二区三区无码| 四虎久久影院| 亚洲中文久久精品无码ww16 | 狠狠精品干练久久久无码中文字幕| 久久精品嫩草影院| 国产高潮国产高潮久久久91| 一本大道加勒比久久综合| 久久久人妻精品无码一区|