首页 > 其他分享 >造花(困难版)

造花(困难版)

时间:2024-08-27 16:28:37浏览次数:9  
标签:10005 cnt 原图 int 困难 back 造花 n1

  • 考虑最终得到的图是一张“菊花图森林”,我们新增一个节点,向菊花图森林上的点随机连边,就能得到原图
  • 这张原图可能很复杂,不好下手,但目标相对简单,我们考虑得到目标的必要条件
  • 枚举原图中的每一条边(u,v),如果存在x和u相连,y和v相连,这四个点要么形成一条长度>3的链,要么形成一个环,都与菊花图矛盾,必须至少删除一个点
  • 如果找不到这样的(u,v),说明原图就满足题意,删除任意点即可
点击查看代码
#include <bits/stdc++.h>
using namespace std;
vector<int>a[10005];
vector<int>c[10005];
int d[10005],sz[10005],ans[5],sum[10005];
bool v[10005];
int cnt,tot,n,m;
void dfs1(int n1)
{
	v[n1]=true;
	c[cnt].push_back(n1);
	for(int i=0;i<a[n1].size();i++)
	{
		if(!v[a[n1][i]])
		{
			dfs1(a[n1][i]);
		}
	}
}
void dfs2(int n1)
{
	v[n1]=true;
	sz[n1]=1;
	sum[n1]=(d[n1]==1);
	for(int i=0;i<a[n1].size();i++)
	{
		if(v[a[n1][i]]==false)
		{
			dfs2(a[n1][i]);
			sz[n1]+=sz[a[n1][i]];
			sum[n1]+=sum[a[n1][i]];
		}
	}
}
bool pd(int n1)
{
	for(int i=1;i<=n;i++)
	{
		v[i]=false;
	}
	for(int i=0;i<a[n1].size();i++)
	{
		d[a[n1][i]]--;
	}
	bool f=true;
	v[n1]=true;
	for(int i=0;i<a[n1].size();i++)
	{
		if(!v[a[n1][i]])
		{
			dfs2(a[n1][i]);
			if(sum[a[n1][i]]==sz[a[n1][i]]-1||sz[a[n1][i]]==2&&sum[a[n1][i]]==2)
			{
				
			}
			else
			{
				f=false;
				break;
			}
		}
	}
	for(int i=0;i<a[n1].size();i++)
	{
		d[a[n1][i]]++;
	}
	return f;
}
void shuchu()
{
	if(ans[0]==0)
	{
		cout<<-1<<"\n";
	}
	else
	{
		sort(ans+1,ans+ans[0]+1);
		for(int i=1;i<=ans[0];i++)
		{
			cout<<ans[i]<<' ';;
		}
		cout<<"\n";
	}
}
void solve(int x,int u,int v,int y)
{
	if(pd(x))
	{
		ans[0]++;
		ans[ans[0]]=x;
	}
	if(pd(u))
	{
		ans[0]++;
		ans[ans[0]]=u;
	}
	if(pd(v))
	{
		ans[0]++;
		ans[ans[0]]=v;
	}
	if(y!=x&&pd(y))
	{
		ans[0]++;
		ans[ans[0]]=y;
	}
	shuchu();
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	int T;
	cin>>T;
	while(T--)
	{
		cin>>n>>m;
		for(int i=1;i<=n;i++)
		{
			a[i].clear();
			c[i].clear();
			v[i]=false;
			d[i]=0;
		}
		for(int i=1;i<=m;i++)
		{
			int u,v;
			cin>>u>>v;
			a[u].push_back(v);
			a[v].push_back(u);
			d[u]++;
			d[v]++;
		}
		cnt=0;
		tot=0;
		ans[0]=0;
		for(int i=1;i<=n;i++)
		{
			if(!v[i])
			{
				cnt++;
				dfs1(i);
			}
		}
		int p=0;
		for(int i=1;i<=cnt;i++)
		{
			int sum=0;
			for(int j=0;j<c[i].size();j++)
			{
				sum+=(d[c[i][j]]==1);
			}
			if(sum+1==c[i].size()||sum==c[i].size()&&c[i].size()==2)
			{
				tot++;
			}
			else
			{
				p=i;
			}
		}
		if(tot==cnt)
		{
			for(int i=1;i<=n;i++)
			{
				cout<<i<<' ';
			}
			cout<<"\n";
		}
		else if(tot==cnt-1)
		{
			bool f=false;
			for(int i=0;i<c[p].size();i++)
			{
				int u=c[p][i];
				for(int j=0;j<a[u].size();j++)
				{
					int v=a[u][j];
					int x=0,y=0;
					for(int k=0;k<a[u].size();k++)
					{
						if(a[u][k]!=v)
						{
							x=a[u][k];
							break;
						}
					}
					for(int k=0;k<a[v].size();k++)
					{
						if(a[v][k]!=u)
						{
							y=a[v][k];
							break;
						}
					}
					if(x&&y)
					{
						f=true;
						solve(x,u,v,y);
						break;
					}
				}
				if(f==true)
				{
					break;
				}
			}
			if(f==false)
			{
				for(int i=1;i<=n;i++)
				{
					cout<<i<<' ';
				}
				cout<<"\n";
			}
		}
		else
		{
			cout<<-1<<"\n";
		}
	}
	return 0;
}

标签:10005,cnt,原图,int,困难,back,造花,n1
From: https://www.cnblogs.com/watersail/p/18382950

相关文章

  • Some 困难的数论
    1.离散对数就是在模\(p\)意义下求出\(\log_ab\)。等价于求出方程\(a^x\equivb\pmodm\)的解。其中的\(x\)就是\(\log_ab\)。当\(a\perpp\)时,BSGS算法可以求解出上面那个方程的解。具体的计算过程如下:我们设块长\(M\),并且\(x=AM-B\),那么\(a^{AM}\equiv......
  • 一些困难题
    加训一下。1.[ARC181E]MinandMaxattheedge场上没人过的神题。(大概是搬运的官方题解)先考虑如何chk一个图是否存在好生成树。观察好生成树的限制,发现其对于非树边的限制是在生成树上连接两点的路径有关。而Kruskal的证明就是对于每条非树边,其边权大于所有其路径上的树......
  • 2024杭电多校第6场 1002.造花(困难版)
    1002提供一种不同于正解的做法重新定义菊花图:菊花图首先是一棵树,其次存在一个点,它指向的点的度数都为1,剩下的都是度数为1的点。那么在枚举删去某个点u时,只需要:1.给u的邻点的度数-1(deg[u]--)2.维护当前度数不为1的点的个数(代码里的non1)3.维护指向的点都为1度点的点的个数(......
  • 【linux学习---1】点亮一个LED是多么的困难!!!
    文章目录1、原理图找对应引脚2、IO复用3、IO配置4、GPIO配置5、GPIO时钟使能6、总结7、编程8、编译9、链接10、格式转换11、反汇编(查看用)12、使用Makefile操作13、代码烧写14、代码验证1、原理图找对应引脚从上图可以看出,蜂鸣器接到了BEEP上,BEEP就是GPIO5......
  • 在使用鼠标和外设时遇到困难
    我希望允许用户点击他选择的潜艇(这些潜艇已经定位:),然后他在屏幕上点击另一次,潜艇就会出现在那里。出于某种原因,无论我点击什么或在哪里,都会出现相同的潜水艇(4号潜水艇),而且在我移动鼠标后,其中一些潜水艇会消失。此外,我还创建了一个循环,该循环应运行5次,但在一次迭代后,我的代码就......
  • 【LeetCode 随笔】面试经典 150 题【中等+困难】持续更新中。。。
    文章目录117.【中等】填充每个节点的下一个右侧节点指针II114.【中等】二叉树展开为链表129.【中等】求根节点到叶节点数字之和124.【困难】二叉树中的最大路径和173.【中等】二叉搜索树迭代器......
  • AI智能分析技术与安防视频融合当前面临的困难与挑战
    人工智能与安防视频的融合为现代安全领域带来了革命性的变化,提高了安全管理水平、降低了管理成本并为用户提供了更加便捷和高效的服务。随着技术的不断进步和应用场景的不断拓展,未来人工智能与安防的融合将展现出更加广阔的发展前景。然而,AI与安防的融合依旧有许多困难需要克服:1......
  • 学习imx6dl遇到的困难总结 持续更新 很痛也很傻
    最近进了新公司开始鼓捣imx6,虽然说之前弄过imx8的应用层,但是底层移植完全不一样简直太无助了。首先介绍下故事背景,拿到一个imx6dl的板子,是基于飞凌的板子改的。网上资料又少,一无所知的我开始了踩坑之路。拿到板子和一套飞凌板子送的源码,本以为是简单的uboot移植,还是厂家给的代码......
  • 力扣224.基本计算器(困难)
    题目​ 给你一个字符串表达式s,请你实现一个基本计算器来计算并返回它的值。解题思路我们可以使用两个栈nums和ops。nums:存放所有的数字ops:存放所有的数字以外的操作,+/-也看做是一种操作然后从前往后做,对遍历到的字符做分情况讨论:空格:跳过(:直接加入ops......
  • ctfshow_web_1(困难题)
    CTFshowweb1(困难题)根据前面做题经验,看见登录框基本都是跑一下爆破,弱口令等等这里用dirmap目录爆破爆出来有一个www.zip把他下载下来看了login.php和reg.php两个文件的源码都对sql注入常见的字符做了严格的过滤,sql注入此路不通看了下main.php看起来是一个显示用......