列表

详情


NC24608. [USACO 2011 Ope S]Learning Languages

描述

Farmer John's N (2 <= N <= 10,000) cows, conveniently numbered 1..N, are fluent in some M (1 <= M <= 30,000) languages, also conveniently numbered from 1..M. Cow i can speak in K_i (1 <= K_i<= M) languages, namely (1 <= <= M). FJ's cows aren't THAT smart, so the sum of K_i over all cows i is at most 100,000.
Two cows can't directly talk to each other unless both speak a common language. However, cows can pass messages along, translating if necessary. In other words, cows A and B can have a conversation if and only if there exists a sequence of cows T_1, T_2, ..., T_k such that A and T_1 share a language, T_1 and T_2 share a language, etc., and T_k and B share a language.
Farmer John wishes that his cows could be even more social, so he wants all his cows to be able to socialize with any other cow. He can buy books to teach any one of his cows any language he pleases. Being a fairly frugal farmer, FJ wants to purchase the minimum number of books necessary to enable all of his cows to speak to each other. Help him determine:
* The minimum number of books he must purchase
* Any set of books assigned to cows in any order which will help him meet this goal; a program will grade your output.
By way of example, suppose there are three cows named Alberta, Bessie, and Contessa along with three languages denoted as #1, #2, and #3. Alberta can speak languages #2 and #3, Bessie can speak language #2, and Contessa can speak language #1. Currently, Alberta and Bessie can talk to each other, but Contessa is left alone.

#1 #2 #3
Alberta x x
Bessie x
Contessa x

FJ wants to fix this situation, so he can buy Contessa a book to teach her language #2. This will ensure all cows speak the same language, so they can all communicate with one another.
Note that an alternate solution exists: instead, FJ could buy
Contessa a book to teach her language #3. Not all cows would speak the same language, but this would still be a valid solution because Contessa could communicate through Alberta (who also speaks language #3) if she wants to talk to Bessie. Other alternatives exist, and any valid alternate solution will also be accepted.

输入描述

* Line 1: Two space-separated integers: N and M
* Lines 2..N+1: Line i+1 describes the languages that cow i can speak with space-separated integers: K_i, .

输出描述

* Line 1: A single integer that is the minimum number of books that FJ must purchase.
* Lines 2..B+1: Line i+1 contains two space-separated integers: the language id # and the id # of the cow to receive book i. If multiple solutions exist, print any one.

示例1

输入:

3 3 
2 3 2 
1 2 
1 1 

输出:

1

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(g++ 7.5.0) 解法, 执行用时: 29ms, 内存消耗: 512K, 提交时间: 2023-06-22 10:14:47

#include<bits/stdc++.h>
using namespace std;
int f[(int)1e5];
int lang[(int)1e5];
int find(int x){
    return f[x]==x?x:f[x]=find(f[x]);
}
int main(){
    int n,m;int x;
    cin>>n>>m;
    for(int i=1;i<=n;i++)f[i]=i;int num;
    int ans=n-1;
    for(int i=1;i<=n;i++){
        cin>>num;
        while(num--){
            cin>>x;
           if(lang[x]){
               if(find(i)!=find(lang[x])){
                   f[find(i)]=find(lang[x]);
                   ans--;
               }
           }
            else lang[x]=i;
        }
    }
    cout<<ans;
    
    
    return 0;
}

C++11(clang++ 3.9) 解法, 执行用时: 48ms, 内存消耗: 632K, 提交时间: 2020-03-07 13:37:23

#include<bits/stdc++.h>
using namespace std;
int n,m,f[1000000],nn,x,p[1000000],ans;int find(int x){return f[x]==x?x:f[x]=find(f[x]);}void merge(int x,int y){int fx=find(x),fy=find(y);if(fx!=fy)f[fx]=fy,ans--;}
int main(){cin>>n>>m;ans=n;for(int i=1;i<=n;i++)f[i]=i;for(int i=1;i<=n;i++){cin>>nn;for(int j=1;j<=nn;j++){cin>>x;if(p[x])merge(i,p[x]);else p[x]=i;}}cout<<ans-1<<endl;
}

上一题