3 条题解
-
1
题意: 有 n 只牛,每只牛会几种语言,两只牛可以通过某些它们都会语言或者其他牛的翻译沟通。 现在给你这些牛会的语言,求要教多少头牛新的语言这些牛才能畅所欲言。
做法: 把会同一种语言的牛当成一个小组,当一头牛同时加入两个个小组时,这两个小组就可以合并,最后剩余的小组数减一就是要交的语言数量。
代码:
#include<bits/stdc++.h> using namespace std; const int N=1e6+10; int n,m,ans,fa[N],px[N]; int find(int x){return (fa[x]==x)?x:fa[x]=find(fa[x]);}//查找 void he(int x,int y)//合并 { int fx=find(x),fy=find(y); if(fx!=fy)fa[fx]=fy,ans--;//若能合并则可以少学一种语言 } int main() { cin>>n>>m;ans=n; for(int i=1;i<=n;i++)fa[i]=i;//初始化 for(int i=1;i<=n;i++) { int k;cin>>k; for(int j=1;j<=k;j++) { int l;cin>>l; if(px[l])he(i,px[l]);//若根节点存在则合并 else px[l]=i;//否则自己为根节点 } } cout<<ans-1;//要减一 } -
0
#include <bits/stdc++.h> using namespace std; const int N = 40010; int fa[N], a[N]; int findfa(int x) { return (x == fa[x]) ? x : fa[x] = findfa(fa[x]); } int main() { int n, m; cin >> n >> m; for (int i = 1; i <= n + m; i++) fa[i] = i; for (int i = 1; i <= n; i++) { int k; cin >> k; for (int j = 1; j <= k; j++) { int x; cin >> x; int tx = findfa(i); int ty = findfa(x + n); fa[tx] = ty; } } for (int i = 1; i <= n; i++) a[i] = findfa(i); sort(a + 1, a + n + 1); int cnt = unique(a + 1, a + n + 1) - a - 1; cout << cnt - 1 << "\n"; return 0; } -
0
#include<bits/stdc++.h> using namespace std; const int N = 40010; int fa[N],a[N]; int findfa(int x){return (x==fa[x]) ? x : fa[x]=findfa(fa[x]); } int main() { int n,m;cin >> n >> m; for(int i = 1;i <= n+m;i++)fa[i] = i; for(int i = 1;i <= n;i++) { int k;cin >> k; for(int j = 1;j <= k;j++) { int x;cin >> x; int tx=findfa(i); int ty=findfa(x+n); fa[tx]=ty; } } for(int i=1;i<=n;i++)a[i]=findfa(i); sort(a+1,a+n+1); int cnt=unique(a+1,a+n+1)-a-1; cout << cnt - 1 <<"\n"; return 0; }
- 1
信息
- ID
- 1550
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 7
- 标签
- 递交数
- 109
- 已通过
- 28
- 上传者