首页 > 代码库 > Uva 10608 Friends
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 else49 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 }
Uva 10608 Friends
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。