青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

The Fourth Dimension Space

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

ZOJ 2588-Burning Bridges(圖的連通性問題——求割邊)

今天想看看關于橋的求法,搜到了這樣一個題,由與網上缺少相關的資料,花了很多時間在找資料上,最后發現lrj的書上有這個問題的描述:
無向圖的割點和橋(見lrj書)

算法基于以下原理:(1)如果根頂點的兒子數大于1,則根頂點是割點(2)如果一個點和這個點的子孫都不存在指向這個點祖先的后向邊,則這個點為割點。實現時需要對每個結點記錄一個low值,表示該結點的子孫能夠到達的最小的深度,如果這個值小于或等于該點的深度,則該點為割點。如果

y是x的兒子并且y的low值大于x的深度,則邊(x,y)為圖的橋。

原來求割點和求割邊是同一回事,難怪網上只有割點的資料,割邊的幾乎沒有提及。具體的算法看lrj的書,這里說一下做題的心得。

主要是兩個方面:
1。題目中給出的圖是有重邊的,如何判斷重邊?這個問題很重要 根據題意,沒法確定重邊中的那一條邊會被燒掉,所以重邊一定不是我們想要的結果,要從求出的橋里面剔除。我想了比較長的時間,開矩陣吧,10000*10000的矩陣雖然定位是O(1)的,但是這么大的矩陣肯定爆。
所以只能用鄰接表。可鄰接表如何判重,難道線性掃描一遍?每一次加邊都要從表頭掃到表尾,然后才能實現插入,最壞的情況是0+1+2+3+...+m-1=O(m^2)。(當然這有點極端,畢竟n只有10000級別,是邊的十分之一)建立鄰接表的復雜度就有點。。。另外 20個case。。。
但是事實上,這道題我就是這么做的,鄰接表+內存池,線性掃描判重,用的時間大約是時限的五分之一。。。可以接受。。。

2。這個題中給出的是無向邊,建鄰接表的時候正反都要建,但是一但正向被搜索過,方向就定了,DFS的過程實際就是將一個無向圖,轉換成一個有根的有向的深度優先生成樹的過程。所以,每考察一個節點就要記錄下他的父親節點,不能將父子邊當成回邊,這個要特別注意。然后就是
low[ p->t ]> dfsn[k]
重邊的時候要特殊照顧,其余的就是標準的算法過程了。

另外要使用鄰接表的時候,不要用vector,效率實在太低,指針+內存池才是王道!
//This is the source code for ZOJ 2588
//Coded By abilitytao
//2009年9月26日
#include<stdio.h>
#include
<string.h>
#include
<stdlib.h>

#define DOTMAX 10001
#define EDGEMAX 100001
#define min(a,b) ( (a)<(b)?(a):(b) )
int cmp(const void *a,const void *b)
{

    
return (*(int*)a)-(*(int*)b);
}

struct node
{
    
int t;
    
int index;
    
int num;
    node 
*next;
}
dotset[EDGEMAX*2];
node hash[DOTMAX];
int record[EDGEMAX];

int count=0;
node 
*Newnode()
{
    node 
*p;
    p
=&dotset[count];
    count
++;
    
return p;
}

void init(int n)
{
    
int i;
    
for(i=1;i<=n;i++)
    
{
        hash[i].next
=NULL;
        hash[i].t
=-1;
    }

}


void inputcase(int n,int m)
{
    
int flag;
    
int i;
    init(n);
    
int a,b;
    node 
*p;
    node 
*q;
    
for(i=1;i<=m;i++)
    
{
        flag
=0;
        scanf(
"%d%d",&a,&b);
        
for(p=&hash[a];p->next!=NULL;p=p->next)
        
{
            
            
if(p->t==b&&p->num==1)
            
{
                flag
=1;
                
break;
            }

            
else if(p->t==b&&p->num==0)
            
{
                flag
=1;
                p
->num+=1;
                
break;
            }

        }

        
if(flag==1)
            
continue;
        
while(p->next!=NULL)
        
{
            p
=p->next;
        }

        q
=Newnode();
        q
->t=b;
        q
->index=i;
        q
->num=0;
        q
->next=NULL;

        p
->next=q;
        
//////////////////////////////////////////////////////////////////////////

        p
=&hash[b];

        q
=Newnode();
        q
->index=i;
        q
->t=a;
        q
->num=0;

        q
->next=p->next;
        p
->next=q;
    }



}




int res=0;
void dfs( int father,int k,int s,int &cnt,node hash[],bool visit[],int dfsn[],int low[])
{
    
++cnt;
    dfsn[k]
= cnt, low[k]= cnt, visit[k]= true;
    
    
int num= 0;
    node 
*p;
    
for( p=hash[k].next ;p!=NULL; p=p->next )
    
{
        
if(p->t==father)
            
continue;
        
if!visit[ p->t ] )
        
{
            num
++;
            dfs(k,p
->t,s,cnt,hash,visit,dfsn,low );
            
            low[k]
= min( low[k], low[ p->t ] );
            
            
if( low[ p->t ]> dfsn[k] )  
            
{
                
if(p->num==0)
                
{
                    res
++;
                    record[res]
=p->index;
                }

            }

        }

        
else if(k!=p->t)
            low[k]
= min( low[k], dfsn[ p->t ] );
    }

}



int FindKeyPoint(node hash[],int s,int n)
{
    
    
int cnt=0;
    
bool visit[DOTMAX]={false};
    
int low[DOTMAX]={0};
    
int dfsn[DOTMAX]={0};
    dfs(
-1,s,s,cnt,hash,visit,dfsn,low);
    
return res;
}




int main()
{

    
int testcase;
    scanf(
"%d",&testcase);
    
int i,j;
    
int n,m;
    
int num;
    
for(i=1;i<=testcase;i++)
    
{
        res
=0;
        count
=0;
        scanf(
"%d%d",&n,&m);
        inputcase(n,m);
        num
=FindKeyPoint(hash,1,n);
        qsort(record
+1,num,sizeof(record[0]),cmp);
        printf(
"%d\n",num);
        j
=1;
        
for(j=1;j<num;j++)
        
{
            printf(
"%d ",record[j]);
        }

        
if(num!=0)
            printf(
"%d\n",record[j]);
        
if(i!=testcase)
            printf(
"\n");
    }

    
return 0;
}

posted on 2009-09-26 01:35 abilitytao 閱讀(1520) 評論(0)  編輯 收藏 引用


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            久久综合久久综合这里只有精品 | 99视频精品在线| 免费亚洲一区| 久久永久免费| 亚洲精品乱码久久久久久蜜桃麻豆 | 亚洲视频免费看| 亚洲美女视频在线观看| 女同一区二区| 亚洲午夜伦理| 亚洲欧美日本伦理| 国模叶桐国产精品一区| 久久免费少妇高潮久久精品99| 久久久91精品国产一区二区三区| 亚洲国产毛片完整版| 一本色道**综合亚洲精品蜜桃冫 | 一本色道久久综合亚洲精品高清| 国产精品另类一区| 欧美不卡高清| 国产精品成人在线| 久热国产精品| 欧美三级中文字幕在线观看| 久久婷婷麻豆| 欧美日韩一区二区三区高清| 久久久999精品视频| 欧美久久精品午夜青青大伊人| 欧美在线视频免费播放| 欧美日韩国产专区| 国产精品一区二区你懂得| 亚洲欧洲精品成人久久奇米网| 亚洲一级黄色av| 亚洲欧洲精品一区| 欧美一级专区| 在线视频中文亚洲| 欧美福利视频一区| 久久久久久**毛片大全| 国产精品福利影院| 亚洲日本国产| 国产精品网站一区| 亚洲精品乱码久久久久久蜜桃91| 黄色成人在线观看| 亚洲欧美日韩一区二区三区在线观看 | 亚洲一区影音先锋| 欧美国产一区二区| 欧美激情中文不卡| 亚洲国产精品久久人人爱蜜臀| 久久国产加勒比精品无码| 欧美一级免费视频| 国产美女精品视频| 性做久久久久久久久| 欧美一区二区精品| 国产欧美日韩视频| 亚洲欧美日韩人成在线播放| 欧美专区日韩专区| 国产日韩在线视频| 久久成人国产精品| 美女脱光内衣内裤视频久久网站| 国自产拍偷拍福利精品免费一| 欧美在线啊v| 久久亚洲高清| 亚洲国产精品成人综合色在线婷婷| 久久久久久一区二区| 欧美mv日韩mv国产网站| 亚洲欧洲在线免费| 欧美日本国产一区| 亚洲午夜av在线| 久久国内精品自在自线400部| 国产日韩精品在线播放| 久久国产手机看片| 欧美国产极速在线| 在线视频一区二区| 国产视频在线观看一区二区| 久久天天躁狠狠躁夜夜av| 亚洲第一久久影院| 日韩午夜av在线| 欧美日韩亚洲三区| 久久精品在线观看| 欧美视频日韩| 亚洲第一伊人| 国产日韩精品电影| 亚洲欧美日韩在线高清直播| 亚洲欧美激情一区| 欧美性事免费在线观看| 伊人久久久大香线蕉综合直播| 久久久久久久一区二区| 亚洲国产精选| 国产日产欧美a一级在线| 久久影视三级福利片| 亚洲精品少妇网址| 91久久线看在观草草青青| 亚洲欧洲一区二区天堂久久| 亚洲午夜激情网页| 国产一区二区三区在线观看视频 | 亚洲欧美在线网| 久久亚洲一区| 亚洲盗摄视频| 亚洲欧洲一区二区三区| 久久国产免费| 国产日韩欧美高清| 欧美理论电影在线播放| 午夜一区二区三区在线观看| 欧美jjzz| 日韩一级网站| 免费久久99精品国产自在现线| 一区二区高清| 亚洲福利视频网站| 亚洲欧美日韩综合aⅴ视频| 在线观看国产欧美| 激情成人亚洲| 欧美大片在线观看一区| 99这里只有精品| 久久久在线视频| 在线成人av.com| 久久狠狠亚洲综合| 欧美激情亚洲国产| 亚洲视频在线观看免费| 亚洲免费观看高清在线观看| 久久久久久网站| 免费在线成人| 香蕉成人伊视频在线观看| 国产伦精品一区二区三区视频黑人| 精品成人a区在线观看| 黑人巨大精品欧美一区二区| 免费在线看一区| 在线视频你懂得一区二区三区| 欧美激情一区二区三区四区| 蘑菇福利视频一区播放| 欧美久久电影| 久久成人精品一区二区三区| 欧美风情在线观看| 欧美国产视频日韩| 亚洲欧美国产日韩天堂区| 国产精品日韩欧美| 亚洲精品免费网站| 久久精品中文| 久久国产精品黑丝| 99在线热播精品免费99热| 欧美日韩国产在线看| 在线一区视频| 久久久久se| 91久久精品网| 这里是久久伊人| 午夜精品视频网站| 欧美国产日本在线| 亚洲视频狠狠| 欧美高清在线一区| 亚洲欧美国产高清| 久久一区二区三区四区五区| 欧美一区二区三区久久精品| 国产精品美女午夜av| 亚洲欧美视频一区| 免费观看一区| 影音先锋中文字幕一区二区| 国产农村妇女精品一二区| 99一区二区| 亚洲国产高清一区| 久久亚洲综合网| 久久综合久久88| 久久午夜精品一区二区| 欧美成人资源| 欧美mv日韩mv亚洲| 国产精品午夜电影| 亚洲综合激情| 精品成人一区二区三区| 亚洲午夜精品视频| 欧美大片免费观看在线观看网站推荐| 欧美在线黄色| 国产精品视频| 国产日韩一区二区三区| 久久躁狠狠躁夜夜爽| 亚洲精品一区二区三区樱花| 亚洲精品国久久99热| 亚洲在线免费| 久久久水蜜桃av免费网站| 99精品99| 国产亚洲福利一区| 国内揄拍国内精品久久| 免费日韩av| 亚洲欧洲视频在线| 乱中年女人伦av一区二区| 国产亚洲亚洲| 久久精品国产v日韩v亚洲| 久久久久久久网| 亚洲第一天堂无码专区| 9色精品在线| 日韩视频在线观看国产| 久久人人爽国产| 在线视频欧美日韩| 免费成人av在线| 国产精品电影网站| 欧美成年视频| 免费不卡中文字幕视频| 欧美一区二区高清| 欧美专区日韩视频| 亚洲午夜日本在线观看| 久久蜜臀精品av| 亚洲国产精品欧美一二99| 99riav1国产精品视频| 欧美高清在线一区| 午夜亚洲福利在线老司机| av不卡在线|