poj 1182 食物链
来源:互联网 发布:淘宝卖东西包装怎么办 编辑:程序博客网 时间:2024/05/23 01:22
题目是中文的题目意思就不多说了。这是本来是并查集但是,并不是简单的并查集。这是一题带权并查集。
基本的并查集套用基本的模板就行了。
int findx(int x){ int r=x; while(bin[r] !=r) r=bin[r]; return r;}
这题要在查找的时候找到权值。带权并查集和普通并查集最大的区别在于带权并查集合并的是可以推算关系的点的集合
假设arr[a]=b,rank[a]=0表示同类;rank[a]=1表示b可以吃a;rank[a]=2表示a可以吃b。
对于一组数据d,x,y,若x与y的根节点相同,利用(rank[y]-rank[x]+3)%3!=d-1若不相等说明为假话;若x与y根节点不同,说明两者不在同一集合里,
进行组合。让x的根fx成为y的根fy的父节点(arr[fy]=fx),rank[fy]的值需要仔细归纳。
#include<stdio.h>#include<string.h>int arr[50005];int rank[50005];void init(int n){for(int i=1;i<=n;i++){arr[i]=i;}memset(rank,0,sizeof(rank));}int find(int x){if(x!=arr[x]){int fx=find(arr[x]);rank[x]=(rank[x]+rank[arr[x]])%3;arr[x]=fx;}return arr[x];}int merge(int x, int y,int type){int fx=find(x);int fy=find(y);if(fx==fy){if((rank[y]-rank[x]+3)%3!=type)return 1;else return 0;}arr[fy]=fx;rank[fy]=(rank[x]-rank[y]+type+3)%3;return 0;}int main(){int n,k;int sum,i;int d,x,y;scanf("%d%d",&n,&k);init(n);sum=0;for(i=1;i<=k;i++){scanf("%d%d%d",&d,&x,&y);if(x>n||y>n||(x==y&&d==2)){sum++;}else if(merge(x,y,d-1))sum++;}printf("%d\n",sum);return 0;}
0 0
- poj 1182 食物链
- poj 1182 食物链
- poj 1182 食物链(转)
- poj 1182 食物链
- poj 1182 食物链
- poj 1182 食物链
- POJ-1182 食物链
- POJ 1182 食物链
- poj 1182食物链
- POJ 1182 食物链
- POJ 1182 食物链
- poj 1182 食物链
- POJ 1182 食物链
- POJ 1182 食物链
- poj 1182 食物链
- POJ 1182 - 食物链
- poj 1182 食物链
- poj 1182 食物链
- java特性 多态
- 为什么很多人不喜欢做程序员?甚至讨厌程序员?
- Qt on Android:资源文件系统qrc与assets
- poj 3208 Apocalypse Someday(数位dp)
- Null value was assigned to a property of primitive type setter of cn.itcast.oa.domain.Forum.topicCou
- poj 1182 食物链
- 使用jsp过滤器实现登录权限
- 添加手势交互
- linux服务器遭受攻击后对系统检查和安全防范
- 后台服务日志(log4cplus)输出规范
- java抽象类与接口区别
- canada goose chilliwack-844
- windows下检测文件改变
- hadoop 自定义Writable