并查集应用
/* 这道题采用并查集的思路初始化3*N的并查集数组,x,x+N,x+2*N依次对应A,B,C物种,即par[x]=x;x为A物种,par[x+N]=x+N;x为B物种。以此为前提后,给出的信息就可以进行如下操作:第一种x和y是同一物种,则合并(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){ //第一种x和y是同一物种
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;
}
图
- 什么是图
图由顶点(vertex/node)和边(edge)构成。顶点代表对象,边代表对象之间的连接关系。顶点的集合为V,边的集合为E的图记为G=(E,V),链接u和e的边记为e(u,v)。
- 无向图和有向图
无向图的术语:相邻的顶点的序列称为路径,起点和终点重合的路径叫做环或圈,一个图中任意两点都有路径链接就是连通图,否则就是非连通图。顶点的边数就是度。没有环的连通图称为树,没有环的非连通图称为森林。一颗树的总边数为顶点-1,反之总边数为顶点-1的连通图就是树。
带权图