bzoj1370 [Baltic2003]Gang团伙(并查集)
来源:互联网 发布:luarocks windows 编辑:程序博客网 时间:2024/04/28 04:24
对于朋友,我们直接合并两人所在的集合。对于敌人,我们分别合并一人与另一人的敌人。我们只需再记下每个人的一个敌人即可。最后统计有多少个连通块便是答案
#include<cstdio>#include<cstring>#define N 1005inline int read(){ int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar(); return x*f;} int n,m,fa[N],e[N];bool flag[N];inline int find(int x){ return fa[x]==x?x:fa[x]=find(fa[x]);}int main(){// freopen("a.in","r",stdin); n=read();m=read(); for(int i=1;i<=n;++i) fa[i]=i; for(int i=1;i<=m;++i){ char p[1];scanf("%s",p); int x=read(),y=read(); if(p[0]=='F'){ int xx=find(x),yy=find(y); if(xx!=yy) fa[xx]=yy; } if(p[0]=='E'){ if(!e[x]) e[x]=y; if(!e[y]) e[y]=x; int xx=find(e[x]),yy=find(y); if(xx!=yy) fa[xx]=yy; xx=find(x),yy=find(e[y]); if(xx!=yy) fa[xx]=yy; } } memset(flag,0,sizeof(flag)); int ans=0; for(int i=1;i<=n;++i){ int x=find(i); if(!flag[x]){ ans++;flag[x]=1; } } printf("%d",ans); return 0;}
阅读全文
0 0
- 【bzoj1370】[Baltic2003]Gang团伙 并查集
- bzoj1370 [Baltic2003]Gang团伙(并查集)
- [BZOJ1370] [Baltic2003]Gang团伙
- bzoj1370 [Baltic2003]Gang团伙
- BZOJ1370: [Baltic2003]Gang团伙
- 【bzoj1370】[Baltic2003]Gang团伙
- 1370: [Baltic2003]Gang团伙 并查集
- BZOJ 1370 Baltic2003 Gang团伙 并查集
- BZOJ 1370 [Baltic2003]Gang团伙 并查集
- bzoj 1370: [Baltic2003]Gang团伙 并查集
- BZOJ 1370: [Baltic2003]Gang团伙 并查集
- BZOJ 1370: [Baltic2003]Gang团伙 并查集题解
- bzoj1370 团伙 【并查集】
- [Baltic2003]gang团伙
- 【暂无】 并查集 犯罪团伙(gang.cpp)
- BZOJ 1370: [Baltic2003]Gang团伙
- [BZOJ]1370 Gang团伙 镜像并查集
- 团伙-并查集
- 队列(Queue)
- 导航栏与当前页对应
- snake主动轮廓模型
- 【官方推荐】基于STM32单片机的热门物联网应用设计方案
- 折半查找&顺序查找
- bzoj1370 [Baltic2003]Gang团伙(并查集)
- HTTP Content-type 对照表
- 大白话讲解BP算法
- 把图片保存到数据库中和从数据库中读取图片--项目琐碎总结
- Spring事务管理(详解+实例)
- 母函数入门
- IDEA:Spring boot + Mybatis 省市区级联筛选
- 关于yii2中间表关联查询
- JavaScript中两个等号(“==”)和三个等号(“===”)的区别