首页 > 其他分享 >[2019 集训队互测 Day 4]绝目编诗

[2019 集训队互测 Day 4]绝目编诗

时间:2023-12-20 11:46:16浏览次数:33  
标签:fr int sqrt dep 2019 tp && 编诗 绝目

题意

给出一个 \(n\) 个点 \(m\) 条边的简单无向图,判断是否存在两个长度相同的简单环。

题解

发现 环的个数超过 \(n\) 的时候,一定有两个长度相同的简单环。

当 \(m\ge 2n\) 的时候,环的个数达到了 \(n+1\),一定有两个长度相同的环。

所以 \(m\) 比较大的情况就略去了。

在考虑如何暴力,考虑爆搜每个环,我们要做到每走一步都能保证有新的环产生,这样的话找到一个环需要 \(n^3\) 的复杂度(每次往前走一步的时候判一下能否不经过已经走过的点到达),最多 \(n\) 个环,复杂度 \(O(n^4)\)

考虑优化,大胆猜测 \(m-n\) 很小,实际上可以证明是 \(2\sqrt{n}\) 级别的。那么找出一个搜索树之后,找到搜索树以外的边的虚树,那么这个图就变成了只有 \(O(sqrt{n})\) 个点的带权图,跑上面的方法就行了。复杂度 \(O(n^2)\)

结论证明:对于每条边,有 \(\sqrt{n}\) 的概率把他删除的话,期望会删除 \(\sqrt n\) 条边,而长度为 \(c\) 的环保留的概率为 \((1-\frac1{\sqrt{n}})^c\),那么等比数列求和一下得到期望最终有不超过 \(\sqrt{n}\) 个环,把这些环全部删除后就是树了。

#include<bits/stdc++.h>
using namespace std;
const int N=10005;
int n,m,u,v,fa[N],vs[N],p[N],h[N],hd[N],e_num=1,cnt;
vector<int>g[N];
struct edge{
	int v,nxt,w,f;
}e[N<<3];
void add_edge(int u,int v,int w)
{
	e[++e_num]=(edge){v,hd[u],w,0};
	hd[u]=e_num;
}
int find(int x)
{
	if(fa[x]==x)
		return x;
	return fa[x]=find(fa[x]);
}
void dfs(int x,int y)
{
	if(vs[x])
		p[x]=2;
	int s=0;
	for(int v:g[x])
		if(v^y)
			dfs(v,x),vs[x]|=vs[v],s+=vs[v];
	if(s>1)
		p[x]=2;
}
void sou(int x,int y,int tp,int dep,int d)
{
	if(y&&p[x]==2)
		add_edge(x,tp,dep-d),add_edge(tp,x,dep-d),tp=x,d=dep,p[x]=2;
	else
		p[x]=1;
	for(int v:g[x])
		if(v^y)
			sou(v,x,tp,dep+1,d);
}
int doit(int x,int fr)
{
	p[x]=1;
	for(int i=hd[x];i;i=e[i].nxt)
	{
		if(e[i].v==fr||e[i].v>fr&&!vs[e[i].v]&&!p[e[i].v]&&doit(e[i].v,fr))
			return 1;
	}
	return 0;
}
int ok(int x,int fr)
{
	memset(p,0,sizeof(p));
	return doit(x,fr);
}
void suo(int x,int fr,int c,int ls)
{
	vs[x]=1;
	for(int i=hd[x];i;i=e[i].nxt)
	{
		if(e[i].f)
			continue;
		e[i^1].f=1;
		if(!vs[e[i].v]&&e[i].v>fr)
		{
			if(ok(e[i].v,fr))
				suo(e[i].v,fr,c+e[i].w,x);
		}
		if(e[i].v==fr)
		{
			if(h[c+e[i].w]>2)
			{
				puts("Yes");
				exit(0);
			}
			h[c+e[i].w]++;
		}
		e[i^1].f=0;
	}
	vs[x]=0;
}
int main()
{
	scanf("%d%d",&n,&m);
	if(m>n+200)
		return puts("Yes"),0;
	int cnt=0;
	for(int i=1;i<=n;i++)
		fa[i]=i;
	for(int i=1;i<=m;i++)
	{
		scanf("%d%d",&u,&v);
		if(find(u)!=find(v))
			g[u].push_back(v),g[v].push_back(u),fa[find(u)]=find(v);
		else
			vs[u]=vs[v]=1,add_edge(u,v,1),add_edge(v,u,1);
	}
	for(int i=1;i<=n;i++)
		if(!p[i])
			dfs(i,0),sou(i,0,i,0,0),p[i]=2;
	memset(vs,0,sizeof(vs));
	for(int i=1;i<=n;i++)
		suo(i,i,0,i);
	puts("No");
	return 0;
}

标签:fr,int,sqrt,dep,2019,tp,&&,编诗,绝目
From: https://www.cnblogs.com/mekoszc/p/17916185.html

相关文章

  • IDE之VS:Visual Studio的简介(包括 VS2013、VS2015、VS2017、VS2019、VS2022)、安装、
    原文链接:https://blog.csdn.net/qq_41185868/article/details/81052119最近开始使用vs2019,应该是最新的版本。之前都是vs2015,感觉19更智能,兼容性更好,速度也更快。详细了解下这几个版本。1、简介:MicrosoftVisualStudio(简称VS)是美国微软公司的开发工具包系列产品,功能完备的I......
  • 戴尔PowerEdge R750 机架式服务器初始安装Windows Server 2019 服务器系统
    2.安装原版WindowsServer2019操作系统安装操作系统时在SSD硬盘上无法安装,错误如下: 1.在BIOS界面下检查物理磁盘是否处于online状态:2.将“FirmwareDeviceOrder”设置为enable,并重启:设置步骤:Vew-MainMenu-ControllerManagement-AdvancedControllerProperties,将......
  • 20191117丁乙倍——个人贡献
    任务详情1简述你完成的工作2你们小组总共的代码行数,你贡献的代码行数?相关代码链接?3你们小组总共的文档数?你贡献的文档数?相关链接?1.完成的工作:数据库的设计和实现,数据库的连接2.小组总共完成的带码数:4800多行我贡献的代码数:982行代码链接:https://gitee.com/butanethiol/d......
  • Qt 5.9.6+VS2019 community 环境配置
    介绍GCCminGW安装Qt5.9.6安装VS2019community略配置VS2019community在VS的管理拓展里面下载Qtvisualstudiotools如果下得很慢就手动下载vsaddin......
  • SQL Server 2019 非域&非集群环境创建Always On “只读扩展”
     SQLServer2019开始支持“read-scaleforanAlwaysOnavailabilitygroup”,中文翻译的很别扭,是"读取缩放",繁体版翻译为“读取级别”,其特点不依赖于windows的cluster集群以及域,简化了搭建操作步骤和前置条件,与传统的availabilitygroups类似,缺点是无法实现自动故障转移,本质......
  • 计概杂烩2019
    2019期末癌细胞体积#include<stdio.h>doubler;intmain(void){scanf("%lf",&r);printf("%.3lf",4.0*3.14159*r*r*r/3); return0;}寻找三角形#include<stdio.h>/*C语言初始模板程序*/intmain(void){inta,b,n,ans=0;......
  • Aapche Dubbo Java反序列化漏洞(CVE-2019-17564)
    AapcheDubboJava反序列化漏洞(CVE-2019-17564)漏洞描述ApacheDubbo是一款高性能、轻量级的开源JavaRPC服务框架。Dubbo可以使用不同协议通信,当使用http协议时,ApacheDubbo直接使用了Spring框架的org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter类做远程......
  • F. 纪念品 - 2023HBUCM程序设计竞赛/CSP-J2019
    题面小伟突然获得一种超能力,他知道未来\(T\)天\(N\)种纪念品每天的价格。某个纪念品的价格是指购买一个该纪念品所需的金币数量,以及卖出一个该纪念品换回的金币数量。每天,小伟可以进行以下两种交易无限次:任选一个纪念品,若手上有足够金币,以当日价格购买该纪念品;卖出持有的......
  • [极客大挑战 2019]HardSQL
    SQL注入,猜测后台代码类似 SELECTidFROMtable_nameWHEREusername=input1ANDpassword=input2;发现过滤了空格比较符号和大部分函数名,但是没有过滤关键字。使用1'OR(true)#万能密码尝试登录,显示登录成功,判断可以进行布尔盲注。构造如下语句,更改left参数与减去的字符......
  • P5048 [Ynoi2019 模拟赛] 题解
    题意给定\(n\)个数,有\(m\)个询问,每个询问给定\(l\)和\(r\),求出区间\(l\)到\(r\)中的最小众数出现次数,强制在线。数据范围:\(n\le500000\),空间限制:\(62.5MB\)。思路这道题的弱化版是蒲公英,这道题加强的地方在于数据范围。正常的分块求区间众数的空间复杂度是\(O(n......