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

并查集

Posted on 2009-11-12 22:03 rikisand 閱讀(541) 評論(0)  編輯 收藏 引用 所屬分類: TopcoderAlgorithm

昨天看了sedgewick的alg in c 的第一章,主要介紹了個find-union 判斷聯通的算法,其實用到了并查集的知識

剛才偶然看見poj并查集的題集 就copy過來自己也寫寫看~~·

慢慢來~~ 寫完一道上一道~~

       POJ 1182 食物鏈
http://acm.pku.edu.cn/JudgeOnline/problem?id=1182

還以為是最簡單的一道呢,被列在最前面,原來是擴展的應用,不是那么直接啊~

糾結了一會兒,看了解題報告才有思路。關鍵是在并查集的基礎上增加一個數組,維護其與根節點的關系;

詳情寫到注釋里面吧:

int A[100003][3];
int root[50005],k[50005];//root記錄節點所屬于的樹木id k記錄節點與根的關系0 同類1子是食物2子是天敵
int sz[50005];
int find(int x){
    if(root[x]==x)return x;//如果是根則返回
     else if(root[root[x]]==root[x])return root[x];//如果第一層,則返回
    int father=root[x];
    root[x]=find(father);//放到第一層,減少下次find時間,減小樹的高度
    k[x]=(k[x]+k[father])%3;//由自己與根的關系以及父節點與根的關系推斷出新的自己與根的關系,實際上是為了解決union后的節點與根的關系
                                            //因為union后,非根節點并沒有更新k,因此需要在此處處理更新
    return root[x];
}
inline void Union(int x,int y,int kind){
    int a=find(x);int b=find(y);
     if(sz[a]>sz[b]){//判斷后決定,要把size小的放到size大的上去,優化作用不大
    root[b]=a ; //b成為a的子樹
    k[b]=(k[x]-k[y]+kind+3)%3;//要把b變成a的子樹,從a出發,到x,經過kind,到y,再到b ,可以得到kb的狀態改變公式
    sz[a]+=sz[b];}
    else{
        if(kind==1)kind=2;
        root[a]=b;
        k[a]=(k[y]-k[x]+kind+3)%3;
        sz[b]+=sz[a];
    }
}
int main()
{
    int N,d;
    freopen("d:\\input.txt","r",stdin);
    scanf("%d %d",&N,&d);
    for(int i=1;i<=N;i++)sz[i]=1;
    int cnt=0;
     for(int s=1;s<=N;s++)root[s]=s;
    int LIE=0;
    int i=0;
    while(i !=d) {
        scanf("%d %d %d",&A[i][0],&A[i][1],&A[i][2]); 
        if(A[i][1]>N || A[i][2]>N ) {LIE++;i++;continue;}
        if(A[i][0]==1){
            if(find(A[i][1]) == find(A[i][2])){
                if(k[A[i][1]]!=k[A[i][2]]) LIE++;
            }
            else   Union(A[i][1],A[i][2],0); 
         }
        else{
            if( find(A[i][1])==find(A[i][2]) ){if(k[A[i][2]] != ( k[A[i][1]]+1)%3)LIE++;}
            else  Union(A[i][1],A[i][2],1); 
        }
    i++;
    }
    cout<<LIE<<endl;
    return 0;
}
POJ 1611 The Suspects

http://acm.pku.edu.cn/JudgeOnline/problem?id=1611


 int G[30005];
 int sz[30005];
 int Find(int x){
    if(G[x]==x)return x;
    else {
        while(G[x]!=x){//half路徑壓縮~等下試試看全壓縮的效率~那樣就是遞歸調用啦
            int t=G[x];
            G[x]=G[t];
            x=t;
        }
        return x;
    }
 }
 void Union(int x,int y){
    if(sz[x]<sz[y])swap(x,y);//把size小的弄到大的上面
    G[y]=x;
    sz[x]+=sz[y];
 }
   int main()
{
    freopen("d:\\input.txt","r",stdin);
    int N,M,num;
    while(true){
        scanf("%d %d",&N,&M);
        if(N==0&&M==0)return 0;
        for(int i=0;i<N;i++)G[i]=i,sz[i]=1;
        for(int i=0;i<M;i++){
            scanf("%d",&num);
            int root,stu,x,y;
            for(int j=0;j<num;j++){
                scanf("%d",&stu);
                if(j==0)root=Find(stu);//簡單的都和第一個合并
                else{
                    root=Find(root);
                    x=Find(stu);if(root!=x)Union(root,x);
                }
            }
        }
        printf("%d\n",sz[Find(0)]);
    }
}

POJ 2524 Ubiquitous Religions

又一道水題~~ 呵呵 

不貼代碼了 和上面一道基本一樣~
http://acm.pku.edu.cn/JudgeOnline/problem?id=2524

POJ 1861

http://acm.pku.edu.cn/JudgeOnline/problem?id=1861

kruskal+并查集+half路徑壓縮

比較基礎的題

struct Edge{
    int from;
    int to;
    int value;
}E[15000];
int A[1005]; 
int sz[2009];
bool comp(const Edge& a,const Edge& b){
    return a.value<b.value;
}
using namespace std; 
int Find(int x){
    if(A[x]==x)return x;
    else if(A[A[x]]==A[x]) return A[x];
    int father;
    while(A[x]!=x){
        father=A[x];
        A[x]=A[father];//把每一個路過的節點放到祖父下面去
        x=father;
    }
    return x;
}
void Union(int x,int y){
    if(sz[y]>sz[x])swap(x,y);//小的放到大的下面
    sz[x]+=sz[y]; 
    A[y]=x;    
}
   int main()
{
    freopen("d:\\input.txt","r",stdin);
    int N,M,num,x,y;
    scanf("%d %d",&N,&M);
    int cnt=0;
    while(cnt<M)  scanf("%d %d %d",&E[cnt].from,&E[cnt].to,&E[cnt].value),cnt++;
    sort(E,E+M,comp);//從小到大選n-1條邊,如果起點和終點在一個集合則continue;else Union
    for(int i=0;i<=N;i++)sz[i]=1,A[i]=i;
    vector<int> ans(N-1);
    int mst=0,MX=0;
    for(int i=0;mst!=N-1;i++){
        int x=Find(E[i].from);int y=Find(E[i].to);
        if(x==y)continue;
        Union(x,y);
        ans[mst]=i;
        mst++;
        if(E[i].value>MX)MX=E[i].value;
    }
    printf("%d\n%d\n",MX,N-1);
    for(int i=0;i<N-1;i++)
        printf("%d %d\n",E[ans[i]].from,E[ans[i]].to);
}


        POJ 1456 Supermarket
http://acm.pku.edu.cn/JudgeOnline/problem?id=1456
 

       POJ 1733 Parity game
http://acm.pku.edu.cn/JudgeOnline/problem?id=1733
 

       hdu 3038 How Many Answers Are Wrong
http://acm.hdu.edu.cn/showproblem.php?pid=3038
 

     POJ 1417 True Liars(難)
http://acm.pku.edu.cn/JudgeOnline/problem?id=1417
 

   POJ 2912 Rochambeau(難)

http://acm.pku.edu.cn/JudgeOnline/problem?id=2912

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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国产精品免费| 久久中文字幕导航| 一本色道久久综合狠狠躁篇的优点| 免费观看日韩av| 国产精品高潮粉嫩av| 久久久欧美精品| 欧美日韩国产麻豆| 国产日韩欧美在线播放| 欧美福利视频网站| 久久午夜影视| 香蕉成人久久| 欧美日韩精品二区第二页| 久久精品国产第一区二区三区最新章节| 亚洲欧美经典视频| 亚洲深夜激情| 亚洲国产精品va在线看黑人 | 国产精品理论片| 免费欧美在线| 国内精品99| 欧美一区二区精品| 午夜国产欧美理论在线播放| 欧美日本在线观看| 亚洲高清在线观看一区| 国内精品久久久久影院 日本资源| 亚洲精品一区二区三区在线观看| 久久夜色精品| 欧美成人69| 亚洲黄色成人网| 老妇喷水一区二区三区| 久久久亚洲高清| 含羞草久久爱69一区| 久久久噜久噜久久综合| 久久字幕精品一区| 亚洲国产成人精品久久久国产成人一区| 亚洲一区二区三区欧美| 亚洲欧美国产精品桃花| 亚洲素人一区二区| 午夜精品国产精品大乳美女| 国产精品美女久久久浪潮软件| 亚洲午夜黄色| 久久久成人精品| 亚洲二区在线视频| 欧美精品一区二区三区在线看午夜| 免费影视亚洲| 99精品欧美一区| 国产精品色婷婷久久58| 美女视频黄免费的久久| 一本色道久久综合精品竹菊| 午夜精品久久久久久久白皮肤| 国产一区二区三区丝袜| 老司机精品福利视频| 亚洲日本理论电影| 国产日韩精品一区二区三区| 久久久久成人精品免费播放动漫| 欧美国产综合| 久久精品观看| 亚洲一区国产视频| 亚洲欧洲一区二区天堂久久 | 国产视频精品网| 另类天堂视频在线观看| 欧美亚洲专区| 亚洲免费观看在线视频| 欧美电影免费观看网站| 欧美在线视频全部完| 午夜日韩在线| 欧美一区二区三区另类| 午夜久久久久久久久久一区二区| 亚洲高清色综合| 一区二区视频免费完整版观看| 国产精品九九久久久久久久| 欧美激情久久久| 欧美成人r级一区二区三区| 久久嫩草精品久久久精品| 午夜精品久久久久久久99热浪潮| 亚洲精品视频一区| 一区二区av在线| 性做久久久久久久久| 久久精彩免费视频| 你懂的国产精品| 欧美日韩一区三区| 免费成人av在线| 夜夜嗨av一区二区三区四区| 亚洲精选在线观看| 亚洲欧美区自拍先锋| 久久精品国产亚洲一区二区| 久久人人97超碰精品888| 欧美激情第10页| 国产精品一区免费在线观看| 亚洲愉拍自拍另类高清精品| 亚洲欧美日韩一区二区三区在线| 久久精品成人| 国产精品第一区| 黄网站色欧美视频| 亚洲视频第一页| 欧美国产日本在线| 亚洲深夜影院| 欧美精品在线播放| 精品999在线播放| 亚洲欧美春色| 亚洲人成小说网站色在线| 亚洲欧美日本另类| 欧美性色综合| 99成人精品| 亚洲精品国精品久久99热| 久久在精品线影院精品国产| 国产精品久久久一区麻豆最新章节| 好男人免费精品视频| 欧美一区二区三区视频在线观看| 亚洲电影免费观看高清完整版| 欧美一区国产在线| 国产精品青草久久| 欧美一区在线视频| 亚洲欧美日韩国产一区二区三区| 欧美特黄视频| 午夜视频久久久| 午夜精品理论片| 伊人久久久大香线蕉综合直播| 性亚洲最疯狂xxxx高清| 亚洲视频自拍偷拍| 国产一区二区三区在线观看视频 | 亚洲尤物视频在线| 亚洲美女av黄| 国产精品影视天天线| 久久久久久久久久久久久9999| 欧美在线视频一区二区| 亚洲高清视频的网址| 亚洲免费观看视频| 亚洲色在线视频| 亚洲国产视频一区| 国产精品福利影院| 嫩草影视亚洲| 麻豆91精品91久久久的内涵| 免费成人av| 欧美一区二区三区免费大片| 裸体歌舞表演一区二区| 亚洲欧美高清| 欧美二区在线看| 久久综合电影| 国产精品综合不卡av| 亚洲福利视频二区| 国产欧美日韩三级| 日韩一级大片在线| 亚洲电影成人| 久久av红桃一区二区小说| 亚洲性线免费观看视频成熟| 久久精品91久久久久久再现| 一本色道精品久久一区二区三区 | 欧美激情一区二区三区成人| 亚洲尤物在线| 欧美日韩国产a| 亚洲精品视频免费观看| 亚洲精品欧美专区| 欧美不卡在线视频| 亚洲黄色av| 欧美日韩不卡合集视频| 午夜精品久久久久久久久久久久久 | av成人免费观看| 亚洲精品视频在线看| 美女日韩在线中文字幕| 欧美激情1区2区3区| 久久久美女艺术照精彩视频福利播放| 国产一区欧美| 亚洲欧洲精品一区二区三区波多野1战4 | 欧美成人黄色小视频| 欧美日韩精品系列| 日韩亚洲一区在线播放| 亚洲制服丝袜在线| 国产一区二区三区免费不卡| 久久久久久黄| 亚洲精品午夜精品| 亚欧成人在线| 91久久线看在观草草青青| 欧美sm视频| 亚洲欧美中文另类| 欧美高清视频一区| 亚洲欧美日韩国产综合| 娇妻被交换粗又大又硬视频欧美| 蜜桃伊人久久| 亚洲欧美国产毛片在线| 亚洲第一中文字幕| 久久久爽爽爽美女图片| 日韩视频在线观看一区二区| 国产精品久久久久久久久久免费| 亚洲欧美经典视频| 亚洲伦理在线观看| 欧美成人69av| 久久在线观看视频| 久久成人精品无人区| 亚洲调教视频在线观看| 精品成人一区二区| 国产婷婷一区二区| 国产精品久久久久久超碰| 欧美激情按摩| 欧美日韩国内自拍| 欧美日韩裸体免费视频| 欧美日韩1区2区|