首页 > 其他分享 >CF611H New Year and Forgotten Tree

CF611H New Year and Forgotten Tree

时间:2023-02-24 09:23:03浏览次数:42  
标签:cnt 匹配 int Tree return 枚举 Forgotten New 关键点

首先注意到:任何合法方案一定能调整成:每种位数选一个关键点,每条边都至少有一个关键点。

本质上是希望找一个边和点的匹配。

一种思路是确定关键点之间形成的树后(暴力枚举),让每条边匹配一个关键点。

但关键点是没有连边限制的,所以是要和有限个非关键点匹配。建立二分图匹配的网络流模型:源点向左部的边连 cnt 的流量,每条边向右部的两个点连一条边,点向汇连 cnt 的流量。

另一种思路是发现可以用 Hall 定理判断状态是否合法:确定根后是边和儿子的匹配,任意点集不小于边集即可。枚举所有本质不同的方案。

实际上不需要确定根,只需要保证点集大小大于边集大小。只需要不断枚举一种边加入判断是否合法。

时间复杂度都是能过。

思路二的代码:

#include <bits/stdc++.h>
using namespace std;
const int M=6;
int n,m,p[M],s[M],a[M][M];
int cnt(int x) {return x?cnt(x/10)+1:0;}
bool chk(){
	for(int i=0;i<1<<m;i++){
		int v=0,e=0;
		for(int j=0;j<m;j++) if(i>>j&1) v+=s[j];
		if(!v) continue;
		for(int j=0;j<m;j++) if(i>>j&1) for(int k=0;k<m;k++) if(i>>k&1) e+=a[j][k];
		if(v<=e) return 0; 
	}
	return 1;
}
bool upd(){
	for(int i=0;i<m;i++) for(int j=0;j<m;j++) if(s[i]&&(a[i][j]||a[j][i])){
		int&v=a[i][j]?a[i][j]:a[j][i];
		v--;s[i]--;
		if(chk()) return printf("%d %d\n",p[i]+s[i],p[j]),1;
		v++;s[i]++;
	}
	return 0;
}
int main(){
	cin.tie(0)->sync_with_stdio(0);
	cin>>n;
	m=cnt(n);p[0]=1;
	for(int i=1;i<=n;i++) s[cnt(i)-1]++;
	for(int i=1;i<m;i++) p[i]=p[i-1]*10;
	for(int i=1;i<n;i++){
		string u,v;
		cin>>u>>v;
		a[u.size()-1][v.size()-1]++;
	}
	if(!chk()) return puts("-1"),0;
	while(upd());
	return 0;
} 

标签:cnt,匹配,int,Tree,return,枚举,Forgotten,New,关键点
From: https://www.cnblogs.com/shrshrshr/p/17150165.html

相关文章

  • vue源码分析-从new Vue开始
    初学vue,你得知道我们是从newVue开始的:newVue({el:'#app',data:obj,...})那你觉得是不是很有意思,咱们newVue之后,就可以使用他那么多的功能,可见Vue是暴出......
  • el-tree 获取父级节点数据
    转自于:https://my.oschina.net/u/3704598/blog/4438210 使用node-click事件,该事件会接收三个参数,分别是当前data节点数据,node当前节点,root根节点数据。我们通过......
  • CF825G - Tree Queries
    现在有\(n\)次操作,每次将一个点设为黑色,或者查询:从当前点到任意黑点路径上最小值的最小值。保证第一次操作是设置黑点。强制在线。我们考虑这样一个过程,我们把第一次操......
  • 接了ChatGPT的NewBing如何评价CodeGeeX
    一篇《如何用CodeGeeX替代GitHubCopilot》的文章在开发者社区登上热榜,开发者关注的AI生成代码工具CodeGeeX,这款插件产品目前支持在VSCode市场和JetbrainsIDEs下载使用......
  • dev控件-treelist多列显示
    经测试,如果需要多列显示,必须通过设计器配置KeyFieleName和ParentFieldName两个字段,通过代码无效。可以通过设计界面的AddColumn菜单,为TreeList添加多列,并绑定相关的字段,......
  • ARC121F Logical Operations on Tree【DP】
    给定一棵树,给每个点填\(0\)或\(1\),给每条边填\(\text{AND}\)或\(\text{OR}\),求有多少种填法满足存在一种缩边的顺序,使得每次把一条边的两个端点缩成一个点,权为原端点......
  • NEW创建类对象与直接创建类对象区别
    一、new创建类对象与不new区别下面是自己总结的一些关于new创建类对象特点:new创建类对象需要指针接收,一处初始化,多处使用new创建类对象使用完需delete销毁new创建对象......
  • 覆盖(new),重写(Override)和重载(Overload)
    覆盖:new关键词修饰方法,保留父类方法重写:override关键词修饰方法,不保留父类方法覆载:同一个类中,方法名相同,参数不同覆盖(new)覆盖(new)指重新定义子类中与父类具有相同函数特......
  • new bing 申请(2023.2.22成功)
    记录备忘环境:万维网(us)微软账号步骤:访问bing.com/new,先尝试点击加入候补名单,如果出现出错了,请重试,继续以下步骤根据brant_liu在微软社区的回答,需......
  • sourcetree中本地项目提交到远程仓库的具体方法
    转:https://pcedu.pconline.com.cn/1533/15337252.htmlsourcetree中本地项目提交到远程仓库的具体方法2022-08-2516:45 出处:其他 作者:佚名 能否取代智能手机后的新......