L2-3 病毒溯源

本文介绍了一个使用C++解决的查找集合(查集)问题,涉及从叶子结点向上找根的过程,重点在于理解如何利用初始父节点值-1确定源病毒。作者提到避免用字符串排序处理大整数问题。
摘要由CSDN通过智能技术生成
#include "bits/stdc++.h"
#include "string.h"
using namespace std;
const int N = 1e5 + 10;
int s[N];
vector<int> a[N];
vector<int> v;
int k = 0;
bool cmp(vector<int> x,vector<int>  y){
	if(x.size() != y.size()) return x.size() > y.size() ;
	else return x < y;
}
void find(int x){;
	 a[k].push_back(x);
	if(s[x] != -1) {	
		find(s[x]);	
	}
	else return ;	
}
int main(){
	int n;
	memset(s, -1, sizeof(s));
	cin>>n;
	int m = n;
	int x, y, h = 0;
	for(int i = 0; i < n; i++){
		cin>>x;
		if(x == 0) v.push_back(i);
		int z = x;
		while(z--){
			cin>>y;
			s[y] = i; 			
		}
		
	}
	for(int i = 0; i < v.size(); i++){
		find(v[i]);
		k ++; 
		reverse(a[k - 1].begin(), a[k - 1].end());
	}
	sort(a, a + k, cmp);
	cout<<a[0].size()<<endl;
	for(int i = 0; i < a[0].size(); i++){
		cout<<a[0][i];
		if(i != a[0].size() - 1 ) cout<<" ";
	}
	return 0;
}

思路:很简单的题目,其实就是一个查集往上找根,因为我们把所有点的初始父点都设为-1,在加入所有节点的父节点之后,从叶子结点一直向上找,由于源头只有一个,所以必定会自然的找到一个节点,其父节点是-1,这也是唯一一个没有直接源病毒的节点,因为其就是源病毒。叶子结点就是没有子节点的,反映到题目上就是没有衍生变异病毒,也就是每一行的第一个数是0。笔者其实最一开始就写对了,但是一直用的字符串排序,一直错搞心态,因为数字很大的时候字符就表示不了了,所有很多时候不能用数字转字符进行比较,虽然字符串比较大小比较方便,但也要注意范围啊!

  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小竹子14

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值