zoukankan      html  css  js  c++  java
  • BZOJ 3296 [USACO2011 Open] Learning Languages:并查集

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3296

    题意:

      农夫约翰的N(2 <= N <= 10,000)头奶牛,编号为1...N。

      一共会流利地使用M(1<= M <=30,000)种语言,编号从1...M。

      第i头,会说K_i(1 <= K_i <= M)种语言,即L_i1, L_i2,..., L_{iK_i} (1 <= L_ij <= M)。

      FJ的奶牛不太聪明,所以K_i的总和至多为100,000。

      两头牛,不能直接交流,除非它们都会讲某一门语言。然而,没有共同语言的奶牛们,可以让其它的牛给他们当翻译。换言之,牛A和B可以谈话,当且仅当存在一个序列奶牛T_1,T_2,...,T_k,A和T_1都会说某一种语言,T_1和T_2也都会说某一种语言...并且T_k和B会说某一种语言。

      农夫约翰希望他的奶牛更加团结,所以他希望任意两头牛之间可以交流。他可以买书教他的奶牛任何语言。作为一个相当节俭的农民,FJ想要购买最少的书籍,让所有他的奶牛互相可以说话。

      帮助他确定:他必须购买的书籍的最低数量。

    题解:

      并查集。

      将所有有共同语言的牛合并。

      因为当前所有的集合两两之间都没有共同语言,所以每买一本书,只能将其中两个集合合并。

      所以:最后答案 = 集合个数 - 1

    AC Code:

     1 #include <iostream>
     2 #include <stdio.h>
     3 #include <string.h>
     4 #include <vector>
     5 #define MAX_N 10005
     6 #define MAX_M 30005
     7 
     8 using namespace std;
     9 
    10 int n,m;
    11 int ans=0;
    12 int par[MAX_N];
    13 int lang[MAX_M];
    14 
    15 void init_union_find()
    16 {
    17     for(int i=0;i<n;i++)
    18     {
    19         par[i]=i;
    20     }
    21 }
    22 
    23 int find(int x)
    24 {
    25     return par[x]==x?x:par[x]=find(par[x]);
    26 }
    27 
    28 void unite(int x,int y)
    29 {
    30     int px=find(x);
    31     int py=find(y);
    32     if(px==py) return;
    33     par[px]=py;
    34 }
    35 
    36 bool same(int x,int y)
    37 {
    38     return find(x)==find(y);
    39 }
    40 
    41 void read()
    42 {
    43     cin>>n>>m;
    44     init_union_find();
    45     memset(lang,-1,sizeof(lang));
    46     int k,l;
    47     for(int i=0;i<n;i++)
    48     {
    49         cin>>k;
    50         for(int j=0;j<k;j++)
    51         {
    52             cin>>l;
    53             if(lang[l]!=-1) unite(i,lang[l]);
    54             else lang[l]=i;
    55         }
    56     }
    57 }
    58 
    59 void solve()
    60 {
    61     for(int i=0;i<n;i++)
    62     {
    63         if(find(i)==i) ans++;
    64     }
    65 }
    66 
    67 void print()
    68 {
    69     cout<<ans-1<<endl;
    70 }
    71 
    72 int main()
    73 {
    74     read();
    75     solve();
    76     print();
    77 }
  • 相关阅读:
    Objects in this class cannot be updated outside
    操作系统原理好书推荐
    Can't initialize OCI
    比较好的GIS blog
    栅格数据开发
    arcgis 本地地图服务 silverlight 调用报错 .
    (转载)Rasterdataset Load data耗时
    网络达人梁宏达
    arcengine总结(1)栅格数据开发
    MyNPOI V1.2发布并开放源码,让.NET Excel导出将简单进行到底【转】
  • 原文地址:https://www.cnblogs.com/Leohh/p/7699323.html
Copyright © 2011-2022 走看看