首页 > 其他分享 >紫罗兰题解

紫罗兰题解

时间:2022-11-16 18:45:24浏览次数:45  
标签:pre int 题解 当且 紫罗兰 cdots 顶点 dis

题意概述

给定一张 \(n\) 个顶点 \(m\) 条边的无向图,顶点的编号在 \(1 \sim n\) 内,第 \(i\) 条无向边连接着顶点 \(x_i\) 与 \(y_i\)。

我们称顶点 \(v_0,v_2,\cdots, v_{k-1}\) 构成了一个大小为 \(k\) 的环,当且仅当 \(k \ge 3\),且对任意 \(0 \le i < k\),图中都存在一条连接顶点 \(v_i\) 与 \(v_{(i+1) \operatorname{mod} k}\) 的无向边。我们称一个环 \(C\) 为最小环,当且仅当图中不存在一个大小严格小于 \(C\) 的环。

现在,你想要求出,图中有多少本质不同的最小环。

我们称两个环 \(C_1(u_0,u_1,\cdots, u_{k-1})\) 与 \(C_2(v_0,v_1,\cdots, v_{k-1})\) 不同,当且仅当组成这两个环的边不同。

输入格式

输入的第一行包含两个整数 \(n\) 和 \(m\) 。

接下来 \(m\) 行,每行两个整数 \(x, y\),描述一条边。图中不包含重边与自环。

输出格式

输出一行一个整数,表示最小环的个数,不存在则输出 \(0\)。

样例一

输入

4 5
1 2
1 3
1 4
2 4
3 4

输出

2

样例二

输入

1000 15
1 2
1 3
1 4
1 5
1 6
2 3
2 4
2 5
2 6
3 4
3 5
3 6
4 5
4 6
5 6

输出

20

思路概述

考场的时候就想到了找包含每个点的环,但是当时为了保证一定经过这个点,还用了lca,甚至每次重新建树,复杂度是nm^2logm,只拿了35分,甚至还没单考虑三个点的环打暴力分数高。

正解

同样是找一定经过每个点的环,每次从当前点bfs,同时记录到该点的距离,如果往后bfs到了已经扫过的点,直接可以直接找到当前环的长度,如果比全局最小值小,就计数归零,否则计数累加即可

code

#include<bits/stdc++.h>
using namespace std;

const int N=3010,M=6010;
int n,m;
int minn=1e9,cnt;
int to[M<<1],nxt[M<<1],h[N],tot;
int dis[N],v[N],pre[N];
map<int,int> pot;

void add(int x,int y)
{
	to[++tot]=y;
	nxt[tot]=h[x];
	h[x]=tot;
}

void BFS(int X)
{
	queue<int> q;
	memset(v,0,sizeof v);
	memset(dis,0x3f,sizeof dis);
	memset(pre,0,sizeof pre);
	q.push(X);
	v[X]=1;
	dis[X]=0;
	while(q.size())
	{
		int x=q.front();
		q.pop();
		for(int i=h[x];i;i=nxt[i])
		{
			int y=to[i];
			if(y==pre[x])continue;
			if(!v[y])
			{
				v[y]=1;
				dis[y]=dis[x]+1;
				pre[y]=x;
				q.push(y);
			}else 
			{
				if(dis[y]+dis[x]+1==minn)
				{
					cnt++;
				}else if(dis[y]+dis[x]+1<minn)
				{
					minn=dis[y]+dis[x]+1;
					cnt=1;
				}
			}
		}
	}
}

int main()
{
	scanf("%d%d",&n,&m);
	n=0;
	for(int i=1;i<=m;i++)
	{
		int x,y;
		scanf("%d%d",&x,&y);
		if(!pot[x])pot[x]=++n;
		if(!pot[y])pot[y]=++n;
		x=pot[x],y=pot[y];
		add(x,y);
		add(y,x);
	}
	for(int i=1;i<=n;i++)BFS(i);
	cout<<cnt/minn/2;
	return 0;
}

标签:pre,int,题解,当且,紫罗兰,cdots,顶点,dis
From: https://www.cnblogs.com/Eternal-QX/p/16897106.html

相关文章

  • DTOJ 2022-11-15 测试 题解
    测试成果100+100+50+10=260还行吧(虽然T2做法很迷惑)A惊鸿(grace)DTOJP6367题面大意给定一个\(n\)行\(m\)列的仅包含小写字母的矩阵\(A\)。求从\((1,1)\)......
  • 长春花题解
    题意概述给定一个素数\(p\),对每个\(0\lex<p\),设\(f(x)\)表示一个最小的非负整数\(a\),使得存在一个非负整数\(b\),满足\((a^2+b^2)\bmodp=x\)。现在,你想要......
  • LeetCode 题解 1922. 统计好数字的数目
    1922.统计好数字的数目-力扣(Leetcode)题解思路一:快速幂#defineMOD1000000007longlongpower(intn,longlongtimes){if(times==1)returnn;if(ti......
  • 【问题解决】ESP32开发板上的CP210xUSB转串口坏了怎么办
        今天居然遇到了主板上的USB转串口芯片坏了的情况!这运气真是。。    还好问题解决了,心理舒服点,这里记录一下,以后大家要是遇到也可以参考。    先吐槽CP210x......
  • AI最前沿 | 重磅专题:类脑机器学习 问题解决器
    AI最前沿|重磅专题:类脑机器学习https://mp.weixin.qq.com/s/gUFb1wXV3QwWRPDaNESvjw子句级关系感知数学单词问题解决器Clause-levelRelationship-awareMathWordPr......
  • LeetCode 题解 46. 全排列
    46.全排列-力扣(Leetcode)题解思路:DFS-注意:力扣测试数据时不会将全局变量重置,要手动重置C代码intptr_line=0;intmark[6];voiddeep_find(intdepth,int*num......
  • 2022.11.14模拟赛题解
    树的覆盖\(dp_{i,j,0/1/2}\)表示以\(i\)为根的子树中覆盖\(j\)个点的方案数。其中\(0/1/2\)分别表示了\(3\)种情况。\(0\)表示示当前节点和子节点都没被选中......
  • CF1748D ConstructOR 题解
    可能更好的食用体验既然题目中用到了位运算,那我们就用二进制来解决这道题。1.判无解观察\(3\,4\,6\)这个样例,我们将其分解二进制:\[\begin{aligned}(3)_{10}&=(11)......
  • 洛谷 P8509 题解(待完善)
    题面。要求所有点到关键点的距离和最小。首先要确定这个点去哪个关键点最短。树上两点间路径与距离是唯一的,所以我们从两个关键点分别跑dfs。第一遍求出每个点到s的最......
  • 神奇脑洞题解——USACO追查坏牛奶(CSGO894)
    COGS的这一题是超级满配版本比洛谷的要强力的多:894.追查坏牛奶-COGS额外要求是:求出最小割流量,同时求出割边最小,同时字典序最小的方案输出割掉的边最小割流量好求,最......