有n个结点,分布在数量未知的树上,也就是说这些树可能是一个森林。 现在给出每个点在各自树上的最远点,如果有多个最远点的话,那就给出id编号最小的那一个点。
直接无脑并查集
#include<iostream>using namespace std;int parent[100005];int find(int x) { return x==parent[x]?x:find(parent[x]);}void Union(int a,int b) { int x=find(parent[a]); int y=find(parent[b]); if(x!=y) parent[x]=y; }int main(){ int n; while(cin>>n) { int a,sum=0; for(int i=1;i<=n;i++) parent[i]=i; for(int i=1;i<=n;i++) { cin>>a; Union(i,a); } for(int i=1;i<=n;i++) if(parent[i]==i) sum++; cout<<sum<<endl; } return 0;}我猜测思路2才是题者想要的解法?
对于每一个结点,如果它的最远点的最远点是自己本身,则这两个点是树上的两端结点最小的直径,也可以认为是某个树的标示。
记录这样的直径的个数就是树的个数。
# -*- coding: utf-8 -*-# @Author: HaonanWu# @Date: 2017-03-02 10:14:55# @Last Modified by: HaonanWu# @Last Modified time: 2017-03-02 10:45:15n = int(input())p = [0]+list(map(int,input().split()))d = set()for i in range(1,n+1): if p[p[i]] == i: d.add(min(i,p[i]))PRint(len(d))新闻热点
疑难解答