Uva 10608 Friends

题目是给出总人数,和两个人之间的朋友关系,最后求最多的朋友的人数。

思路:用并查集去求。

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <iostream>
 4 using namespace std;
 5
 6 int caseNum,citizen,pairNum;
 7 typedef struct node{
 8     int data_;//节点对应人的编号
 9     int rank_;//节点对应的秩
10     int parent_;//节点对应双亲下标
11 }UFSTree;
12 void MAKE_SET(UFSTree t[]);//初始化并查集树
13 int FIND_SET(UFSTree t[],int x);//在x所在子树中查找集合编号
14 void UNION(UFSTree t[],int x,int y);//将x和y所在的子树合并
15 int main()
16 {
17     //freopen("D:\\acm.txt","r",stdin);
18     int maxNum;
19     cin>>caseNum;
20         for(int cycle = 0;cycle < caseNum;cycle++){
21             cin>>citizen>>pairNum;
22             maxNum = 0;
23             UFSTree t[30011];
24             MAKE_SET(t);
25             for(int m = 0;m < pairNum;m++){
26                 int x,y;
27                 cin>>x>>y;
28                 UNION(t,x,y);
29             }
30             for(int op = 1;op <= citizen;op++){
31                 if(maxNum < t[op].rank_)maxNum = t[op].rank_;
32             }
33             cout<<maxNum<<endl;
34         }
35     return 0;
36 }
37 void MAKE_SET(UFSTree t[]){
38     for(int i = 1;i <= citizen;i++){
39         t[i].data_ = i;//数据为该人编号
40         t[i].rank_ = 1;
41         t[i].parent_ = i;//父节点指向自己
42     }
43 }
44 int FIND_SET(UFSTree t[],int x){
45     if(x != t[x].parent_){
46         return (FIND_SET(t,t[x].parent_));
47     }
48     else
49         return x;
50 }
51 void UNION(UFSTree t[],int x,int y){
52     x = FIND_SET(t,x);
53     y = FIND_SET(t,y);
54     if(x==y)return;
55     if(t[x].rank_ > t[y].rank_){
56             t[y].parent_ = x;
57             t[x].rank_ += t[y].rank_;
58     }
59     else{
60         t[x].parent_ = y;
61         t[y].rank_ += t[x].rank_;
62     }
63 }
时间: 2024-10-15 15:33:54

Uva 10608 Friends的相关文章

uva 10608 Friends(并查集)

uva 10608 Friends 题目大意:给出两两之间的关系,求出最大的关系网. 解题思路:并查集裸体. #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <cstdlib> using namespace std; const int N = 30005; typedef long long ll; int n, m; in

UVA 10608

并查集简单题#include <iostream>#include <cstdio>using namespace std;#define max 30010int f[max];int getf(int k){    while(k!=f[k]){        k=f[k];    }    return k;}void combine(int a,int b){    int roota=getf(a);    int rootb=getf(b);    if(roota&g

Problem D UVA 10608

Problem I FRIENDS There is a town with N citizens. It is known that some pairs of people are friends. According to the famous saying that ?The friends of my friends are my friends, too? it follows that if A and B are friends and B and C are friends t

UVA 10608 Friends【并查集】

题目链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1549 题意:给定n个人m种朋友关系,求最大朋友圈的人数.裸并查集 代码: #include <stdio.h> #include <iostream> #include <string.h> #include <algorithm>

UVA 10608 Friends 并查集

并查集水题 有n个人,m队朋友,朋友的朋友,也是朋友,A与B是朋友,B与C是朋友,那么A与C也是朋友,即A,B,C在同一个并查集里,合并即可: 最后会有几个"朋友圈子",求最大的朋友圈的人数. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int r[30005]; int x[30010]; i

CSU-ACM暑假集训基础组训练赛(2) 解题报告

Problem A Codeforces 451A •题意:给你n+m根筷子,将他们分别水平.垂直放置,形成n*m个节点.两个人轮流选择一个点,将穿过这个点的两根筷子拿走,谁可以逼迫对方率先无法继续操作,谁就获胜,问获胜的是先手还是后手. •找规律即可.n,m中较小的那个数是奇数,先手胜,否则后手胜. 1 #include <cstdio> 2 int main(){ 3 int a,b; 4 scanf("%d%d",&a,&b); 5 a = a <

UVA 562 Dividing coins --01背包的变形

01背包的变形. 先算出硬币面值的总和,然后此题变成求背包容量为V=sum/2时,能装的最多的硬币,然后将剩余的面值和它相减取一个绝对值就是最小的差值. 代码: #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; #define N 50007 int c[102],d

UVA 10341 Solve It

Problem F Solve It Input: standard input Output: standard output Time Limit: 1 second Memory Limit: 32 MB Solve the equation: p*e-x + q*sin(x) + r*cos(x) + s*tan(x) + t*x2 + u = 0 where 0 <= x <= 1. Input Input consists of multiple test cases and te

UVA 11014 - Make a Crystal(容斥原理)

UVA 11014 - Make a Crystal 题目链接 题意:给定一个NxNxN的正方体,求出最多能选几个整数点.使得随意两点PQ不会使PQO共线. 思路:利用容斥原理,设f(k)为点(x, y, z)三点都为k的倍数的点的个数(要扣掉一个原点O).那么全部点就是f(1),之后要去除掉共线的,就是扣掉f(2), f(3), f(5)..f(n).n为素数.由于这些素数中包括了合数的情况,而且这些点必定与f(1)除去这些点以外的点共线,所以扣掉.可是扣掉后会扣掉一些反复的.比方f(6)在f