算法竞赛知识提要2

并查集应用

这里写图片描述

/* 这道题采用并查集的思路初始化3*N的并查集数组,x,x+N,x+2*N依次对应A,B,C物种,即par[x]=x;x为A物种,par[x+N]=x+N;x为B物种。以此为前提后,给出的信息就可以进行如下操作:第一种xy是同一物种,则合并(x,y),
(x+N,y+N),(x+2*N,y+2*N)。第二种x要吃y,则合并(x,y+N),(x+N,y+2*N),(x+2*N,y)即可。当然,在合并前应该先判断一下是否产生矛盾,若有矛盾就计数加一。
*/
int T[max],X[max],Y[max];
int ans;//矛盾
int main(){
    init(3*N); //并查集部分编码在《算法竞赛知识提要1》里
               //编号是0~N-1
    for(int i=0;i<K;i++){
        int x = X[i] - 1;
        int y = Y[i] - 1;
        if(x<0||x>=N||y<0||y>=N){
           ans++;
           continue;
         }
       if(T[i]==1){ //第一种xy是同一物种
         if(theSame(x,y+N)||theSame(x,y+2*N)){
            ans++;
          } else{
            unite(x,y);
            unite(x+N,y+N);
            unite(x+2*N,y+2*N);
            }
       }else{      //第二种x要吃了y
         if(theSame(x,y)||theSame(x,y+2*N)){
           ans++;
         }else{
           unite(x,y+N);
           unite(x+N,y+2*N);
           unite(x+2*N,y);
          }
       } 
    }
    cout<<ans<<endl;
    return 0;
}


  1. 什么是图

图由顶点(vertex/node)和边(edge)构成。顶点代表对象,边代表对象之间的连接关系。顶点的集合为V,边的集合为E的图记为G=(E,V),链接u和e的边记为e(u,v)。


  • 无向图和有向图

无向图的术语:相邻的顶点的序列称为路径,起点和终点重合的路径叫做环或圈,一个图中任意两点都有路径链接就是连通图,否则就是非连通图。顶点的边数就是度。没有环的连通图称为树,没有环的非连通图称为森林。一颗树的总边数为顶点-1,反之总边数为顶点-1的连通图就是树。
这里写图片描述
带权图
这里写图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章