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

            misschuer

            常用鏈接

            統(tǒng)計(jì)

            積分與排名

            百事通

            最新評(píng)論

            競(jìng)賽圖

            這是一個(gè)全新的概念,省賽上出現(xiàn)了這種題目,zoj 3332
            http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3332
            圖中任意兩點(diǎn),至少存在一條有向邊,構(gòu)成一個(gè)哈密頓(好像和 哈密爾頓 不同)路;
            對(duì)于一條以構(gòu)建的哈密頓路的n個(gè)點(diǎn)(第1個(gè)點(diǎn)到第n個(gè)點(diǎn),注意 第i個(gè)點(diǎn) 不一定是 點(diǎn)i ,eg,1 - 4 - 2 - 3,第2個(gè)點(diǎn)為4,第3個(gè)點(diǎn)為2,第4個(gè)點(diǎn)為3),
            插入第n+1個(gè)點(diǎn),肯定找到一條有向路與之相連
            這里分3種情況
            1>         第n + 1個(gè)點(diǎn) 與第一個(gè)點(diǎn)相連,使第n + 1個(gè)點(diǎn)成為第一個(gè)點(diǎn)
            2>         最后一個(gè)點(diǎn)與第n+1個(gè)點(diǎn)相連,使第n + 1個(gè)點(diǎn)成為最后一個(gè)點(diǎn)
            3>         能在原哈密頓路中找到一個(gè)相連的點(diǎn) ,第i個(gè)點(diǎn) 和 第i+1個(gè)點(diǎn)  使得   (第i個(gè)點(diǎn)與第n+1個(gè)點(diǎn)  且  第n+1個(gè)點(diǎn)與第i+1個(gè)點(diǎn))相連,所以在第i個(gè)點(diǎn)與第i+1個(gè)點(diǎn)中插入第n+1個(gè)點(diǎn),這是典型的鏈?zhǔn)讲僮鳎?br>

            因此,用STL里的list即可完成如上3步驟;
            我只是略懂略懂,不足之處,請(qǐng)指教,并附上代碼


            #include <iostream>
            #define M 101
            #include 
            <list>
            using namespace std;
            bool f[ M ][ M ];
            bool flag;
            list 
            <int> L;
            list 
            <int>::iterator it , pre;

            void init (int n){
                
            for (int i = 1;i <= n;++ i)
                    
            for (int j = 1;j <= n;++ j)
                        f[ i ][ j ] 
            = false;
            }


            void solve (int n){
                
            int i;
                L.push_back(
            1);
                
            for (i = 2;i <= n;++ i){
                    it 
            = L.begin ();

                    
            if (f[ i ][ *it ]){
                        L.push_front(i);
                        
            continue;
                    }


                    it 
            = L.end();
                    
            -- it;

                    
            if (f[ *it ][ i ]){
                        L.push_back(i);
                        
            continue;
                    }


                    it 
            = pre = L.begin();
                    
            ++ it;
                    
            while (it != L.end()){
                        
            if (f[ *pre ][ i ] && f[ i ][ *it ]){
                            L.insert(it , i);
                            
            break;
                        }

                        pre 
            ++;
                        it 
            ++;
                    }

                }

            }


            int main(){
                
            int t , n , i , k , g;
                
            int a , b;
                scanf (
            "%d" , &t);
                
            while (t --){
                    L.clear();
                    scanf (
            "%d" , &n);
                    k 
            = n * (n - 1/ 2;
                    init (n);
                    flag 
            = true;
                    
            for (i = 1;i <= k;++ i){
                        scanf (
            "%d %d" , &a , &b);
                        f[ a ][ b ] 
            = true;
                    }

                    solve (n);

                    
            if (L.size() != n){
                        puts (
            "Impossible");
                        
            continue;
                    }


                    
            for (it = L.begin(); it != L.end();++ it){
                        
            if (it != L.begin()) printf (" ");
                        printf (
            "%d" , * it);
                    }

                    printf (
            "\n");
                }

                
            return 0;
            }

            posted on 2010-04-21 17:25 此最相思 閱讀(470) 評(píng)論(2)  編輯 收藏 引用

            評(píng)論

            # re: 競(jìng)賽圖 2011-03-27 10:45 速度

            按找這個(gè)題目的數(shù)據(jù),它的任意兩個(gè)點(diǎn)有且僅有一條有向邊,那么最后的答案是一定存在這樣的路的。不可能是impossible的。所以impossible不用判斷了吧?  回復(fù)  更多評(píng)論   

            # re: 競(jìng)賽圖 2011-08-28 16:18 此最相思

            怎么感覺(jué)理論就有問(wèn)題,太坑爹了  回復(fù)  更多評(píng)論   


            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


            亚洲国产精品久久| 亚洲第一永久AV网站久久精品男人的天堂AV | 亚洲国产精品嫩草影院久久| 日本精品久久久久影院日本| 久久免费视频1| 久久噜噜电影你懂的| 欧美精品九九99久久在观看| 一本久久知道综合久久| 久久精品免费观看| 一本久久综合亚洲鲁鲁五月天亚洲欧美一区二区 | 18禁黄久久久AAA片| 韩国免费A级毛片久久| 久久精品无码一区二区三区日韩| 久久久www免费人成精品| 国产成人香蕉久久久久| 国产色综合久久无码有码| 久久精品国产72国产精福利| 久久久国产乱子伦精品作者| 久久久久久久免费视频| 婷婷综合久久中文字幕| 亚洲AV日韩AV永久无码久久| 久久天天躁狠狠躁夜夜2020老熟妇| 婷婷伊人久久大香线蕉AV| 久久只有这精品99| 日本久久久久久久久久| 国产99久久久国产精品~~牛| 色综合久久久久无码专区 | 中文字幕亚洲综合久久| 国产精品对白刺激久久久| 无码人妻久久久一区二区三区| 欧美性大战久久久久久| 久久精品国产精品亚洲人人| 久久精品一区二区国产| 精品久久无码中文字幕| 国产精品免费看久久久| 久久久久国产精品| 91精品国产色综久久 | 亚洲人成无码www久久久| 久久精品视频一| 热re99久久精品国99热| 99久久这里只有精品|