并查集
来源:互联网 发布:网络上课平台教师招聘 编辑:程序博客网 时间:2024/05/22 10:45
http://vjudge.net/contest/view.action?cid=49839#problem/A
A - A
Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64uAppoint description:
Description
Today is Ignatius' birthday. He invites a lot of friends. Now it's dinner time. Ignatius wants to know how many tables he needs at least. You have to notice that not all the friends know each other, and all the friends do not want to stay with strangers.
One important rule for this problem is that if I tell you A knows B, and B knows C, that means A, B, C know each other, so they can stay in one table.
For example: If I tell you A knows B, B knows C, and D knows E, so A, B, C can stay in one table, and D, E have to stay in the other one. So Ignatius needs 2 tables at least.
One important rule for this problem is that if I tell you A knows B, and B knows C, that means A, B, C know each other, so they can stay in one table.
For example: If I tell you A knows B, B knows C, and D knows E, so A, B, C can stay in one table, and D, E have to stay in the other one. So Ignatius needs 2 tables at least.
Input
The input starts with an integer T(1<=T<=25) which indicate the number of test cases. Then T test cases follow. Each test case starts with two integers N and M(1<=N,M<=1000). N indicates the number of friends, the friends are marked from 1 to N. Then M lines follow. Each line consists of two integers A and B(A!=B), that means friend A and friend B know each other. There will be a blank line between two cases.
Output
For each test case, just output how many tables Ignatius needs at least. Do NOT print any blanks.
Sample Input
25 31 22 34 55 12 5
Sample Output
24
加入了压缩路径
#include<stdio.h> #include<stdlib.h> #include<algorithm> #include<iostream> using namespace std; int m,n,parent[20000];void UFset()//初始化{for(int i=1;i<=m;i++)parent[i]=-1;}int Find(int x){int s;//查找位置,一直找到parent[s]为负数为止for(s=x;parent[s]>=0;s=parent[s]);while(s!=x){int tmp=parent[x];//优化方案,压缩路径,更新子节点parent[x]=s;x=tmp;}return s;}void Union( int R1,int R2 ){int r1=Find(R1),r2=Find(R2);int tmp=parent[r1]+parent[r2];//两个集合结点个数之和(负数)if(parent[r1]>parent[r2])//优化方案--加权法则{parent[r1]=r2;//根节点r1所在的树作为r2的子树parent[r2]=tmp;}else{parent[r2]=r1;//<span style="font-family: Arial, Helvetica, sans-serif;">//根节点r2所在的树作为r1的子树</span>parent[r1]=tmp;}}int main(){int N;scanf("%d",&N);while(N--){scanf("%d%d",&m,&n);UFset();int a,b;for(int i=0;i<n;i++){scanf("%d%d",&a,&b);if(Find(a) != Find(b))//这里要进行判断父节点不等,才经行合并Union(a,b);}int num=0;for(int i=1;i<=m;i++){if(parent[i]<0)num++;}printf("%d\n",num);}return 0;}
0 0
- HDU3938 并查集 并查集
- 并查集(集并查)
- HDU1232 并查集<并>
- 并查集
- 数据结构-并查集
- 并查集
- 并查集!
- 并查集
- 并查集
- 并查集
- 并查集
- 并查集总结
- 并查集学习
- 并查集
- 并查集
- 并查集
- 所谓并查集
- 并查集
- MR InputFormat 初解
- 二分图带权匹配 KM算法与费用流模型建立
- 中国房市将拖垮经济?
- unity3D游戏开发五之创建基本游戏场景二
- 黑马程序员-final关键字的特点
- 并查集
- 栈的应用:四则运算表达式求值
- 修改服务器远程访问端口
- php——学习笔记,数字的进制
- unity3D游戏开发六之创建基本游戏场景三
- ZCup后继有“赛”,OCup再度激发魔兽3热情
- poj 2155 二维树状数组
- unity3D游戏开发七之创建基本游戏场景四
- MD5加密工具