图(并查集)4
来源:互联网 发布:网卡的mac地址有多少位 编辑:程序博客网 时间:2024/05/03 10:28
/*
题目1445:How Many Tables
题目描述:
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.
输入:
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.
输出:
For each test case, just output how many tables Ignatius needs at least. Do NOT print any blanks.
样例输入:
2
5 3
1 2
2 3
4 5
5 1
2 5
样例输出:
2
4
*/
#include <stdio.h>
#define N 1001
int tree[N];
int findroot(int x){
if(tree[x] == -1) return x;
else{
int tmp = findroot(tree[x]);
tree[x] = tmp;
return tmp;
}
}
int main(){
int t,i;
while(scanf("%d",&t) != EOF){
while(t--){
int n,m;
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
tree[i] = -1;
while(m--){
int a,b;
scanf("%d%d",&a,&b);
a = findroot(a);
b = findroot(b);
if(a != b) tree[a]=b;
}
int ans = 0;
for(i=1;i<=n;i++) //少写了i=n
if(tree[i]==-1) ans++;
printf("%d\n",ans);
}
}
return 0;
}
题目1445:How Many Tables
题目描述:
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.
输入:
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.
输出:
For each test case, just output how many tables Ignatius needs at least. Do NOT print any blanks.
样例输入:
2
5 3
1 2
2 3
4 5
5 1
2 5
样例输出:
2
4
*/
#include <stdio.h>
#define N 1001
int tree[N];
int findroot(int x){
if(tree[x] == -1) return x;
else{
int tmp = findroot(tree[x]);
tree[x] = tmp;
return tmp;
}
}
int main(){
int t,i;
while(scanf("%d",&t) != EOF){
while(t--){
int n,m;
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
tree[i] = -1;
while(m--){
int a,b;
scanf("%d%d",&a,&b);
a = findroot(a);
b = findroot(b);
if(a != b) tree[a]=b;
}
int ans = 0;
for(i=1;i<=n;i++) //少写了i=n
if(tree[i]==-1) ans++;
printf("%d\n",ans);
}
}
return 0;
}
0 0
- 图(并查集)4
- 并查集(集并查)
- 并查集-4
- 判断连通图(并查集 )
- 图 (并查集)1
- 图 (并查集)2
- 图(并查集)3
- 图(并查集) 5
- 判断连通图(并查集 )
- L2-4 部落 (并查集)
- 【转】并查集(4)--POJ 并查集 题目汇总 ——czyuan原创
- 并查集(含关系并查集)
- 【并查集】食物链(关系并查集)
- 【并查集】并查集详解(转)
- 分组并查集(种类并查集)
- 并查集, 畅通工程(简单并查集)
- [数据结构]并查集水体POJ2236(并查集)
- 【图】【并查集】亲戚
- 【POI2007】【BZOJ1103】大都市meg
- 职业素养与职业迷茫——北漂18年(42)
- SQL Server日期函数总结
- 2016要看的书。
- 查询删除的外向交货单
- 图(并查集)4
- 正则化和模型选择
- SAP潜入移动安全阵地 后ERP发展方向
- Java NIO原理 图文分析及代码实现
- textarea输入的内容保存到数据库,用div显示
- SAP产品成本计算流程
- 对字符串的操作
- iOS 文件路径以及保存
- Optional Map