首页 > 其他分享 >并查集--翻译机的个数(顺丰2020年笔试)

并查集--翻译机的个数(顺丰2020年笔试)

时间:2022-10-26 20:41:16浏览次数:74  
标签:return v2u -- 查集 学习机 int pa findpa 翻译机


某学术会议上,一共有n个人参加,现在已知每个人会的语言(一个人可能不会任何语言)。现在有一种学习机,每一个学习机可以在会议期间使一个人暂时掌握一种自己不会的语言,问要使得任意两个人都能直接或者间接的交流至少准备多少个学习机?

间接交流的意思是:可以通过其他参加会议的人翻译(可能或出现很多人一起帮忙翻译的情况)进行交流。如:第一个人和第二个人会第一种语言,第二个人和第三个人会第二种语言,那么第一个人可以和第三个人进行交流(通过第二个的翻译)

 

输入:

第一行3个数n,m,k代表人物,预言数,已知的信息数。接下来k行,每行两个数u,v,代表第u个人会第v种语言

 

输出:

输出需要准备的学习机的个数

 

样例输入:

3 3 2

2 3

3 1

样例输出:

2

#include<cstdio>
#include<unordered_set>
#include<algorithm>
using namespace std;
const int N=100005;
int pa[N];
bool vis[N];
int v2u[N];
inline void init(int n)
{
for(int i=1;i<=n;++i)
pa[i]=i;
}
int findpa(int x)
{
if(x==pa[x])
return x;
return pa[x]=findpa(pa[x]);
}
inline void Merge(int x,int y)
{
int px=findpa(x),py=findpa(y);
pa[py]=px;
}
bool issame(int x,int y)
{
return findpa(x)==findpa(y);
}
int main()
{
int n,m,k;
scanf("%d%d%d",&n,&m,&k);
init(n);
for(int i=0;i<k;++i)
{
int u,v;
scanf("%d%d",&u,&v);
vis[u]=1;
if(v2u[v]==0)
v2u[v]=u;
else
{
int uu=v2u[v];
if(!issame(uu,u))
Merge(uu,u);
}
}
int num=0;
unordered_set<int> S;
for(int i=1;i<=n;++i)
{
if(vis[i])
S.insert(findpa(i));
else
++num;
}
if(k!=0)
printf("%d\n",num-1+S.size());
else
printf("%d\n",n);
return 0;
}

 

标签:return,v2u,--,查集,学习机,int,pa,findpa,翻译机
From: https://blog.51cto.com/u_13121994/5798368

相关文章

  • 最长非递减子序列--顺丰2020校招笔试题
    n的范围是[0,100000]DP版本(O(n^2))时间复杂度(LTE):#include<cstdio>#include<iostream>#include<algorithm>usingnamespacestd;#defineN100intmain(){intA[N],dp[N......
  • 字符串--移除k个数使得剩下的数最大
    有一十进制正整数,移除其中的K个数,使剩下的数字是所有可能中最大的。假设:字符串的长度一定大于等于K字符串不会以0开头 输入描述:一行由正整数组成的数字字符串,和......
  • DP--爬楼梯1
    题目描述前几个月放映的头号玩家简直火得不能再火了,作为一个探索终极AI的研究人员,月神自然去看了此神剧。由于太过兴奋,晚上月神做了一个奇怪的梦,月神梦见自己掉入了一个被施......
  • DP--字符串变换
    给定两个字符串,已知可以使用三种方式进行变换1.插入一个字符2.删除一个字符3.更改一个字符请设计一个算法,找到两个字符串之间的经历几次最小变换,可以字符串1转换成字......
  • DFS--同一个方向找出所有子字符串的个数
     字符迷阵是一种经典的智力游戏。玩家需要在给定的矩形的字符迷阵中寻找特定的单词。在这题的规则中,单词是如下规定的:1.在字符迷阵中选取一个字符作为单词的开头;2.选取......
  • map记录下标
    题目描述小云正在参与开发一个即时聊天工具,他负责其中的会话列表部分。会话列表为显示为一个从上到下的多行控件,其中每一行表示一个会话,每一个会话都可以以一个唯一正整数id......
  • DFS(全排列)--相同序号不能相邻
     小多想在美化一下自己的庄园。他的庄园毗邻一条小河,他希望在河边种一排树,共M棵。小多采购了N个品种的树,每个品种的数量是Ai(树的总数量恰好为M)。但是他希望任意......
  • N-叉树--遍历N-叉树所有从顶点到叶子节点的路径
    Shopee的OrangeDayShopee每个月都有属于大家的节日,每到这个时候,大家都会穿着橙色的T恤,吃着水果蛋糕,做着游戏。瞧,今天又是OrangeDay了,吃货小虾同学早早的来到现场,看看有没......
  • N-叉树--给定顶点求N叉树的最大深度
    #include<iostream>#include<vector>usingnamespacestd;vector<int>Vec[100005];intResult;voiddfs(intChild,intParent,intPathLength){for(inti=0;i<Vec......
  • 暴力--建物流中转站
     Shopee物流会有很多个中转站。在选址的过程中,会选择离用户最近的地方建一个物流中转站。假设给你一个二维平面网格,每个格子是房子则为1,或者是空地则为0。找到一个空地修......