• <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>
            隨筆-72  評(píng)論-126  文章-0  trackbacks-0
            很好玩的算法
            強(qiáng)連通+縮點(diǎn)可以把一塊點(diǎn)看成一個(gè)點(diǎn),大大加快算法。還有一些無法解決的問題也可以用這個(gè)來解決
            前幾天在林學(xué)院做題的時(shí)候胡搞搞出來了,哈哈
            今天又A了一道
            最近對(duì)圖對(duì)樹越來越有感覺了

            http://acm.hdu.edu.cn/showproblem.php?pid=2767
            #include "stdio.h"
            #include 
            "algorithm"
            using namespace std;
            #define maxn 20001
            struct Node {
                
            int to;
                Node 
            * next;
            }list[maxn],opp[maxn];
            struct SCC{
                
            int time;
                
            int newid;
                
            int idx;
            }hh[maxn];
            int time,newid;
            bool flag;
            bool hash[maxn];
            bool hashid[maxn];
            bool gashid[maxn];
            //--------------------------------------------
            void dfs(int idx) {
                Node 
            * buf;
                buf 
            = list[idx].next;
                
            while(buf) {
                    
            if(!hash[buf->to]) {
                        hash[buf
            ->to] = true;
                        dfs(buf
            ->to);
                    }
                    buf 
            = buf->next;
                }
                
            if(time == 7)
                    time 
            = 7;
                hh[idx].time 
            = time ++;
                hh[idx].idx 
            = idx;
            }
            void dfs2(int idx) {
                Node 
            * buf;
                buf 
            = opp[idx].next;
                
            while(buf) {
                    
            if(!hash[buf->to]) {
                        hash[buf
            ->to] = true;
                        dfs2(buf
            ->to);
                    }
                    buf 
            = buf->next;
                }
                hh[idx].newid 
            = newid;
            }
            void dfs3(int idx) {
                Node 
            * buf;
                buf 
            = list[idx].next;
                
            while(buf) {
                    
            if(hh[idx].newid != hh[buf->to].newid) {
                        hashid[hh[idx].newid] 
            = true;
                        gashid[hh[buf
            ->to].newid] = true;
                    }
                    
            if(!hash[buf->to]) {
                        hash[buf
            ->to] = true;
                        dfs3(buf
            ->to);
                    }
                    buf 
            = buf->next;
                }
            }
            bool cmp(SCC a,SCC b) {
                
            return a.time > b.time;
            }
            //-----------------------------------------
            int main() {
                
            int n,i,a,b,m,T;
                Node 
            * buf;
                scanf(
            "%d",&T);
                
            while(T--) {
                    scanf(
            "%d%d",&n,&m);
                    
            for(i = 1 ; i <= n ; i ++) {
                        list[i].next 
            = NULL;
                        opp[i].next 
            = NULL;
                    }
                    
            while(m --) {
                        scanf(
            "%d%d",&a,&b);
                        buf 
            = (Node *)malloc(sizeof(Node));        //正圖
                        buf->to = b;
                        buf
            ->next = list[a].next;
                        list[a].next 
            = buf;

                        buf 
            = (Node *)malloc(sizeof(Node));        //反圖
                        buf->to = a;
                        buf
            ->next = opp[b].next;
                        opp[b].next 
            = buf;
                    }
                    memset(hash,
            false,sizeof(bool)*(n+1));
                    time 
            = 0;
                    
            for(i = 1 ; i <= n ; i ++) {                //先確定時(shí)間戳
                        if(!hash[i]) {
                            hash[i] 
            = true;
                            dfs(i);
                        }
                    }
                    sort(hh
            +1,hh+1+n,cmp);                        //按時(shí)間戳排序
                    memset(hash,false,sizeof(bool)*(n+1));
                    newid 
            = 0;
                    
            for(i = 1 ; i <= n ; i ++) {                //把點(diǎn)分成幾塊
                        if(!hash[hh[i].idx]) {
                            hash[hh[i].idx] 
            = true;
                            hh[hh[i].idx].newid 
            = ++newid;
                            dfs2(hh[i].idx);
                        }
                    }
                    
            if(newid == 1) {
                        puts(
            "0");
                        
            continue;
                    }
                    memset(hash,
            false,sizeof(bool)*(n+1));
                    memset(hashid,
            false,sizeof(bool)*(newid+1));
                    memset(gashid,
            false,sizeof(bool)*(newid+1));
                    
            for(i =1 ; i <= n ; i ++) {                    //找出塊的出度入度
                        if(!hash[i]) {
                            hash[i] 
            = true;
                            dfs3(i);
                        }
                    }
                    
            int cnt = 0;
                    
            int cnt1 = 0;
                    
            for(i = 1; i <= newid ; i ++) {
                        
            if(!hashid[i])
                            cnt 
            ++;
                        
            if(!gashid[i])
                            cnt1 
            ++;
                    }
                    printf(
            "%d\n",cnt>cnt1?cnt:cnt1);
                }
                
            return 0;
            }


            posted on 2009-05-17 20:36 shǎ崽 閱讀(693) 評(píng)論(0)  編輯 收藏 引用

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


            成人午夜精品久久久久久久小说| 国产福利电影一区二区三区,免费久久久久久久精 | 日韩欧美亚洲综合久久| 国产午夜精品久久久久九九| 91视频国产91久久久| 日韩欧美亚洲综合久久影院Ds| 久久成人精品| 日韩精品无码久久一区二区三| 国产69精品久久久久APP下载 | 亚洲国产综合久久天堂| 久久精品aⅴ无码中文字字幕不卡| 97久久精品午夜一区二区| 久久er国产精品免费观看8| 蜜桃麻豆WWW久久囤产精品| 久久青青草原综合伊人| 久久成人小视频| 久久亚洲高清观看| 欧美亚洲色综久久精品国产| 久久强奷乱码老熟女| 久久久青草久久久青草| 亚洲va久久久噜噜噜久久天堂 | 国内精品伊人久久久久妇| 中文字幕亚洲综合久久| 老色鬼久久亚洲AV综合| 欧美无乱码久久久免费午夜一区二区三区中文字幕 | 一级女性全黄久久生活片免费| 日产精品99久久久久久| 狠狠色婷婷久久综合频道日韩| jizzjizz国产精品久久| 久久99亚洲综合精品首页| 久久精品国产亚洲AV麻豆网站 | 狠狠色丁香久久婷婷综合_中| 久久亚洲AV成人无码| 久久久无码精品亚洲日韩京东传媒| 72种姿势欧美久久久久大黄蕉| 久久国产成人精品国产成人亚洲| 久久国产精品一国产精品金尊| 99久久久精品免费观看国产| www久久久天天com| 国産精品久久久久久久| 色悠久久久久久久综合网|