2 条题解

  • 1
    @ 2026-8-4 10:08:35

    题意: 有 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
      @ 2025-10-8 16:57:46
      #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

      【并查集】学习语言[USACO11OPEN] Learning Languages S

      信息

      ID
      1550
      时间
      1000ms
      内存
      128MiB
      难度
      7
      标签
      递交数
      109
      已通过
      28
      上传者