8VC Venture Cup 2017 - Elimination Round - C

本文解析了CodeForces竞赛中的一道C题,通过使用并查集算法确定了一个由多个树组成的森林中有多少独立的树。介绍了如何利用每个家庭与其最远家庭的关系来构建并查集,并最终得出森林中树的数量。

 

题目链接:http://codeforces.com/contest/755/problem/C

题意:PolandBall 生活在一个森林模型的环境中,定义森林由若干树组成,定义树为K个点,K-1条无向边的图。现在给定每个家庭在对应的树上离他最远的另一个家庭的编号。问这个森林有多少棵树组成。

思路:由于只给出了每个点在树上离他最远的点的坐标而不知道整体结构,但是可以知道该点和给定离他最远的点一定是在同一颗树上,所以维护一个并查集,最后有多少个连通分量就是有多少棵树了。

import java.io.PrintWriter;
import java.util.*;

public class Main {
    public static final int MAXN=10000+10;
    public static int fa[]=new int [MAXN];
    public static int ans;
    public static int find(int x){
        return x==fa[x] ? (fa[x]) : (fa[x]=find(fa[x]));
    }
    public static void Union(int x,int y){
        int rootx=find(x),rooty=find(y);
        if(rootx==rooty)
        {
            return;
        }
        fa[rooty]=rootx;
        ans--;
    }
    public static void main(String[] args) {
        Scanner cin = new Scanner(System.in);
        PrintWriter out = new PrintWriter(System.out);
        int n=cin.nextInt(); ans=n;
        for(int i=1;i<=n;i++){
            fa[i]=i;
        }
        for(int i=1;i<=n;i++){
            Union(i,cin.nextInt());
        }
        out.println(ans);
        cin.close();
        out.flush();
    }
}

 

转载于:https://www.cnblogs.com/kirito520/p/6349431.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值