zoukankan      html  css  js  c++  java
  • 题解 P2661 【信息传递】

    这题 由于每个人只能告诉一个人,所以每个点的出度为1。找最小环。

    坑点:

    图不一定是连通图

    故不能只用一遍bfs/dfs。

    下面讲我的思路

    三个数组(next,vis,dep);
    (next_i)记录第i位同学传递的人
    (vis_i)记录当前点是否访问和是哪一次访问
    (dep_i)记录第i个点在它的访问里的深度
    (dfs)时出现点已被访问,判断

    • 是当前(dfs)访问过的点(then)更新答案
    • 否则不考虑
    #include <cstdio>
    using namespace std;
    int n,ans;
    int vis[200005],dep[200005],next[200005];
    
    int main(){
    	ans=1<<17;
    	scanf("%d",&n);
    	for(int i=1;i<=n;i++)scanf("%d",&next[i]);
    	for(int i=1;i<=n;i++)
    		if(vis[i]==0){
    			int dfs=0,j;
    			for(j=i;vis[j]==0;j=next[j])vis[j]=i,dep[j]=++dfs;
    			if(vis[j]==i && dfs-dep[j]<ans)ans=dfs-dep[j];
    		}
    	printf("%d
    ",ans+1);
    	return 0;
    }
    

    点个赞吧

  • 相关阅读:
    属性MyBank
    C#语法
    NTE与C#
    css3制作网页动画
    网页定位元素
    使用ADO.NET访问数据库
    连接查询和分组查询
    模糊查询和聚合函数
    习题集
    用sql语句操作数据
  • 原文地址:https://www.cnblogs.com/lzxzy-blog/p/11118363.html
Copyright © 2011-2022 走看看