WUSTOJ 1940 打击犯罪 【并查集】

题目来源:http://acm.wust.edu.cn/problem.php?id=1940&soj=0
在这里插入图片描述
★这题本来是不想写博客的,原因是:之前我也不会写,我搜了几篇博客都是WA的代码,我就发一波叭,感谢我滴同学的帮助~

相关知识:

并查集是一种集合思想,将相关的一类放在一个集合中,这里我通过数组来实现(还可以用链表实现)
用到了vector动态数组,用处就是减少内存,下图就是使用前(下)使用后对比(上)
在这里插入图片描述
当然这个不影响时间的,我后来还优化了其他一些东西
还有就是我改掉了以前的习惯,我不用万能头(#include<bits/stdc++.h>)了,听说内存占得更多,而且用习惯了也不好,不然忘记了根本。

思路:

和其他博客不一样,我用的是从后往前添加,而不是从前往后重新来过。当然,我也觉得那些博客貌似没啥问题,但就是过不了 num保存一个集合的成员数,dad理解为一个集合的头爸爸 叭,废话不多说,上代码~

代码:

#include<iostream> 
#include<cstring> 
#include<vector> 
using namespace std; 
int dad[2005],num[2005]; 
vector<int> f[2005]; 
int seek(int k) 
{ 
    if(dad[k]==k) return dad[k]; 
    return seek(dad[k]); 
} 
int main() 
{ 
    int n; 
    while(cin>>n){ 
        for(int i=1;i<=n;i++) {dad[i]=i; num[i]=1; f[i].clear();} 
        for(int i=1;i<=n;i++){ 
            int m;cin>>m; 
            for(int j=1;j<=m;j++){ 
                int a;cin>>a; 
                f[i].push_back(a); 
            } 
        } 
        for(int i=n;i>=1;i--){ 
            int a=seek(i); 
            for(int j=1;j<=f[i].size();j++){ 
                if(f[i][j-1]>i){ 
                    int b=seek(f[i][j-1]); 
                    if(a!=b) {dad[b]=a; num[a]+=num[b];} 
                } 
            } 
            for(int j=1;j<=n;j++) 
            if(num[j]>(n>>1)){ 
                cout<<j<<endl; 
                goto hhh; 
            } 
        } 
        hhh:; 
    } 
    return 0; 
} 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值