3 条题解

  • 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;
      }
      
      • 0
        @ 2025-10-8 16:57:39
        #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
        上传者