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

            The Fourth Dimension Space

            枯葉北風(fēng)寒,忽然年以殘,念往昔,語(yǔ)默心酸。二十光陰無(wú)一物,韶光賤,寐難安; 不畏形影單,道途阻且慢,哪曲折,如渡飛湍。斬浪劈波酬壯志,同把酒,共言歡! -如夢(mèng)令

            POJ 2186 Popular Cows(圖的連通性問(wèn)題——有向圖的強(qiáng)聯(lián)通分量+縮點(diǎn))

            也許你能寫(xiě)出一段精致的文字,但你卻未必能寫(xiě)出一段精辟的代碼。
            這是我最近研究連通性問(wèn)題的一個(gè)體驗(yàn),有的人的書(shū)寫(xiě)了好幾頁(yè)紙,可是最終能用的卻只有1,2句話(huà)而已,我覺(jué)得在計(jì)算機(jī)的世界,沒(méi)有什么比代碼更能直接地表達(dá)出這個(gè)算法的本質(zhì)了!所以我以后要多讀代碼,少看那些空洞的文字。
            言歸正傳,來(lái)看題,這是我寫(xiě)的第一個(gè)強(qiáng)連通分量的題目,其實(shí)求強(qiáng)連通分量的步驟非常簡(jiǎn)單,正反兩次使用dfs,就能得到聯(lián)通分量的一切信息。做完題目我發(fā)現(xiàn),其實(shí)求聯(lián)通分量最大的作用倒在于,聯(lián)通分量可以縮成一點(diǎn),考慮為一個(gè)整體,這樣可以簡(jiǎn)化構(gòu)圖,發(fā)掘出各個(gè)強(qiáng)連通分量外部之間的規(guī)律。
            解題的方法就是:找出圖中所有的強(qiáng)連通分量并將他們縮成一點(diǎn),再用外部的邊重新建圖,統(tǒng)計(jì)出新圖中出度為0的點(diǎn),如果只有一個(gè),那么說(shuō)明這個(gè)強(qiáng)連通分量中的所有點(diǎn)就是題目要求的點(diǎn)。

            題目中要特別注意:內(nèi)存池中預(yù)開(kāi)的點(diǎn)必須是邊的三倍大小,因?yàn)闃?gòu)建正圖,反圖和新圖都需要新建節(jié)點(diǎn)。(因?yàn)檫@個(gè)我wa了一次)
            還有就是絕對(duì)不要使用vector,我用vector寫(xiě)了一個(gè)程序,跑了600+MS,用鏈表.....47MS......10倍以上的差距,汗 - -!

            #include<iostream>
            using namespace std;
            #define DOTMAX 10001
            #define EDGEMAX 50001
            struct node
            {
                
            int t;
                node 
            *next;
            }
            dotset[EDGEMAX*3];

            int count=0;//每一個(gè)case后,count置為0
            node *Newnode()
            {
                node 
            *p;
                p
            =&dotset[count];
                count
            ++;
                
            return p;
            }


            void Addnode(node hash[],int a,int b)
            {
                node 
            *p=&hash[a];
                node 
            *q=Newnode();
                q
            ->t=b;
                q
            ->next=p->next;
                p
            ->next=q;
            }


            node hash[DOTMAX];
            node nhash[DOTMAX];
            node New[DOTMAX];

            int gcc;
            int order[DOTMAX];
            int num;
            int id[DOTMAX];
            int visit[DOTMAX];
            int gccnum[DOTMAX];

            void init(node hash[],int n)
            {
                count
            =0;
                
            int i;
                
            for(i=1;i<=n;i++)
                
            {

                    hash[i].t
            =-1;
                    hash[i].next
            =NULL;
                }

            }


            int n,m;
            void dfs(int u)
            {

                visit[u]
            =1;
                node 
            *p;
                
            int v;
                
            for(p=hash[u].next;p!=NULL;p=p->next)
                
            {
                    v
            =p->t;
                    
            if(!visit[v])
                    
            {
                        dfs(v);
                    }

                }

                num
            ++;
                order[num]
            =u;
            }


            void ndfs(int u)
            {

                visit[u]
            =1;
                id[u]
            =gcc;
                node 
            *p;
                
            int v;
                
            for(p=nhash[u].next;p!=NULL;p=p->next)
                
            {

                    v
            =p->t;
                    
            if(!visit[v])
                    
            {
                        ndfs(v);
                    }

                }

            }



            int main()
            {
                
            int a,b,i;
                
            while(scanf("%d%d",&n,&m)!=EOF)
                
            {

                    init(hash,n);
                    init(nhash,n);
                    init(New,n);
                    
            for(i=1;i<=m;i++)
                    
            {

                        scanf(
            "%d%d",&a,&b);
                        Addnode(hash,a,b);
                        Addnode(nhash,b,a);
                    }

                    memset(visit,
            0,sizeof(visit));
                    num
            =0;
                    
            for(i=1;i<=n;i++)
                    
            {
                        
            if(!visit[i])
                            dfs(i);
                    }

                    memset(visit,
            0,sizeof(visit));
                    gcc
            =0;
                    
            for(i=num;i>=1;i--)
                    
            {

                        
            if(!visit[order[i]])
                        
            {
                            gcc
            ++;
                            ndfs(order[i]);
                        }

                    }

                    
            for(i=1;i<=n;i++)
                    
            {
                        node 
            *p;
                        
            for(p=hash[i].next;p!=NULL;p=p->next)
                        
            {
                            
            if(id[i]!=id[p->t])
                            
            {

                                Addnode(New,id[i],id[p
            ->t]);
                            }



                        }

                    }

                    
            int cnt=0;
                    memset(gccnum,
            0,sizeof(gccnum));
                    
            for(i=1;i<=n;i++)
                    
            {

                        gccnum[id[i]]
            ++;
                    }


                    
            int mark=0;
                    
            for(i=1;i<=gcc;i++)
                    
            {
                        
            if(New[i].next==NULL)
                        
                        
            {
                            cnt
            ++;
                            mark
            =i;
                        }

                    }


                    
            if(cnt==1)
                    
            {

                        printf(
            "%d\n",gccnum[mark]);
                    }

                    
            else
                        printf(
            "%d\n",0);
                }

            return 0;

            }


            posted on 2009-09-26 17:40 abilitytao 閱讀(2294) 評(píng)論(6)  編輯 收藏 引用

            評(píng)論

            # re: POJ 2186 Popular Cows(圖的連通性問(wèn)題——有向圖的強(qiáng)聯(lián)通分量+縮點(diǎn)) 2009-09-30 11:35 foxinhongyan

            一點(diǎn)注釋都沒(méi)有,不是什么好代碼  回復(fù)  更多評(píng)論   

            # re: POJ 2186 Popular Cows(圖的連通性問(wèn)題——有向圖的強(qiáng)聯(lián)通分量+縮點(diǎn)) 2009-09-30 13:55 溪流

            @foxinhongyan

            在追求性能的地方(如 ACM),通常不容易看到好代碼:)  回復(fù)  更多評(píng)論   

            # re: POJ 2186 Popular Cows(圖的連通性問(wèn)題——有向圖的強(qiáng)聯(lián)通分量+縮點(diǎn)) 2009-09-30 18:06 abilitytao

            @foxinhongyan
            @溪流
            在下不才 還請(qǐng)二位前輩多多指教  回復(fù)  更多評(píng)論   

            # re: POJ 2186 Popular Cows(圖的連通性問(wèn)題——有向圖的強(qiáng)聯(lián)通分量+縮點(diǎn)) 2009-10-10 17:57 Ocean.Tu

            代碼就應(yīng)該像女生的裙子  回復(fù)  更多評(píng)論   

            # re: POJ 2186 Popular Cows(圖的連通性問(wèn)題——有向圖的強(qiáng)聯(lián)通分量+縮點(diǎn)) 2009-10-15 21:37 溪流

            @Ocean.Tu

            “像女生的裙子”是怎么樣的?  回復(fù)  更多評(píng)論   

            # re: POJ 2186 Popular Cows(圖的連通性問(wèn)題——有向圖的強(qiáng)聯(lián)通分量+縮點(diǎn)) 2010-03-24 13:33 Wy.Lee

            @溪流
            越短越好  回復(fù)  更多評(píng)論   


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


            久久久久国色AV免费看图片| 国产精品99久久免费观看| 欧美日韩中文字幕久久久不卡| 久久成人国产精品一区二区| 亚洲国产成人久久综合一区77| 97香蕉久久夜色精品国产| 久久亚洲精品人成综合网| 日韩一区二区久久久久久| 久久中文字幕视频、最近更新 | 无码人妻少妇久久中文字幕| 中文字幕日本人妻久久久免费 | 久久99国产精品久久99| 久久婷婷五月综合色99啪ak| 狠狠色噜噜色狠狠狠综合久久| 丁香五月网久久综合| 伊人色综合久久天天人守人婷| 国产一级持黄大片99久久| 日韩十八禁一区二区久久| 久久精品午夜一区二区福利| 久久黄视频| 狠狠久久亚洲欧美专区 | 国产成人久久久精品二区三区| 一级做a爰片久久毛片毛片| 久久99精品综合国产首页| 欧美伊人久久大香线蕉综合| 久久er国产精品免费观看2| 久久人人爽人人爽人人片av麻烦| 国产精自产拍久久久久久蜜| 欧洲人妻丰满av无码久久不卡| 色综合久久久久综合99| 欧美久久综合性欧美| 日本欧美久久久久免费播放网| 久久久WWW成人免费精品| 欧美久久综合性欧美| av无码久久久久不卡免费网站| 91麻豆国产精品91久久久| 久久国产高清一区二区三区| 久久精品国产91久久综合麻豆自制| 色偷偷偷久久伊人大杳蕉| 人人妻久久人人澡人人爽人人精品| 久久久精品无码专区不卡|