zoukankan      html  css  js  c++  java
  • Luogu P2661 信息传递

    Luogu P2661 信息传递

    并查集+判环。(这样做甚至能做成在线的,极限复杂度就只有$O(n^2)$)
    我们在连接一个点到另一个点之前,先用并查集判断是否构成一个环,如果是的话,我们就可以记录下这个答案,然后维护最小的答案。
    那么,如果构成一个环的话,怎么记录它的长度呢?
    我们可以先定义一个变量$cnt$,在并查集获取祖先的函数中使$cnt$的值加$1$,最后函数结束时就能得到这个环的长度了。
    还有一点,如果构成了一个环,那就不要把环的结尾连上,否则会死循环。

    #include<bits/stdc++.h>
    #define N 200010
    #define INF 0x3f3f3f3f
    
    using namespace std;
    
    int n,ans=INF,cnt;
    int fa[N];
    
    void Init() {
    	for(int i=1;i<=n;i++) {
    		fa[i]=i;
    	}
    	return;
    }
    
    int Find(int x) {
    	cnt++;
    	return fa[x]==x?x:Find(fa[x]);
    }
    
    int main()
    {
    	scanf("%d",&n);
    	Init();
    	for(int i=1;i<=n;i++) {
    		cnt=0;
    		int t;
    		scanf("%d",&t);
    		if(Find(t)==i) {
    			ans=min(ans,cnt);
    		}
    		else {
    			fa[i]=t;
    		}
    	}
    	printf("%d",ans);
    	return 0;
    }
    
  • 相关阅读:
    21分钟 MySQL 入门教程
    git学习网址
    Unsupported major.minor version 51.0解决办法
    导入Mybatis_Spring项目遇到的问题
    SQL 模糊查询
    数据持久层
    持久化框架
    ORM
    ORM框架
    重量级框架
  • 原文地址:https://www.cnblogs.com/luoshui-tianyi/p/11494323.html
Copyright © 2011-2022 走看看