link。

断环后把断的边所连的两个点特殊标记,作为两个特殊点。这样就是一个树,树的做法很简单吧,把两个特殊点特殊处理带进状态即可。

具体一点就是,设 \(f(x,c_x,c_f,c_{rt_1},c_{rt_2})\) 表示处理到 \(x\) 点,\(x\) / \(x\) 的前驱 / 特殊点 1 / 特殊点 2 是否染色,转移很基础,具体看代码(代码中写的是状压)。

注意判无解……

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define cmin(x, y) x = min(x, y)
#define cmax(x, y) x = max(x, y)
template<typename T=int> inline T read() {
T x=0; char c=getchar(); bool f=0;
while(c<'0' || c>'9') f|=c=='-',c=getchar();
while(c>='0' && c<='9') x=x*10+(c&15),c=getchar();
return f?-x:x;
}
__attribute__((target("avx"), optimize("O3", "unroll-loops")))
const int INF=1e9+7;
int n,fa[100100],rt,exrt,dp[100100][17];
vector<int> e[100100];
int makeSta(vector<int> v) {
int res=0; assert(v.size()==4u);
for(int i=0; i<4; ++i) {
res+=(1<<(3-i))*v[i];
assert(0<=v[i] && v[i]<=1);
}
return res;
}
int GetAns(const int now,const int f,const int Sta) {
// Sta: colnow(3), colf(2), colrt(1), colexrt(0)
if(~dp[now][Sta]) return dp[now][Sta];
if((now==rt && ((Sta>>3)&1)!=((Sta>>1)&1))
|| (now==exrt && (((Sta>>3)&1)!=(Sta&1))) || (now==exrt && (Sta>>2)&1 && (Sta>>1)&1)) return dp[now][Sta]=INF;
int cnt=(Sta>>3)&1,res=INF; // number of vertexes coloured
for(const int y:e[now]) if(y!=f) cnt+=GetAns(y,now,makeSta({0,(Sta>>3)&1,(Sta>>1)&1,Sta&1}));
if((Sta>>2)&1 || (now==rt && Sta&1) || (now==exrt && (Sta>>1)&1)) cmin(res,cnt);
else {
for(const int y:e[now]) if(y!=f) cmin(res,cnt-GetAns(y,now,makeSta({0,(Sta>>3)&1,(Sta>>1)&1,Sta&1}))
+GetAns(y,now,makeSta({1,(Sta>>3)&1,(Sta>>1)&1,Sta&1})));
}
return dp[now][Sta]=res;
}
int find(int now) { while(now!=fa[now]) now=fa[now]=fa[fa[now]]; return now; }
signed main() {
// freopen("logicians.in","r",stdin);
// freopen("logicians.out","w",stdout);
memset(dp,-1,sizeof dp);
n=read();
for(int i=1; i<=n; ++i) fa[i]=i;
for(int i=1,x,y; i<=n; ++i) {
x=read(),y=read();
if(find(x)!=find(y)) {
fa[find(x)]=find(y);
e[x].push_back(y);
e[y].push_back(x);
}
else rt=x,exrt=y;
}
int ret=INF;
for(const int i:{0,1}) for(const int j:{0,1}) cmin(ret,GetAns(rt,0,makeSta({i,0,i,j})));
if(ret==INF) return puts("-1"),0;
printf("%lld\n",ret);
return 0;
}

「coci 2021-2022 #1」Logičari的更多相关文章

  1. GitHub 公布 2021 Top 10 博文「GitHub 热点速览」

    作者:HelloGitHub-小鱼干 2021 年在这周彻底同我们告别了,在本周的「News 快读」模块你可以看到过去一年 GitHub 的热门文章,其中有我们熟悉的可能让很多程序员"失业& ...

  2. 灵感宝盒新增「线上云展会」产品,「直播观赏联动」等你共建丨RTE NG-Lab 双周报

    前言 哈喽各位开发者,「RTE NG-Lab 双周报」如期而至! 近两周,我们更新了一些新的实时互动场景和产品,也举办了代码实验室的第一次线下活动,与大家一起体验了声网最新的 4.0 SDK. 灵感宝 ...

  3. 众安「尊享e生」果真牛的不可一世么?

    近日,具有互联网基因的.亏损大户(成立三年基本没盈利,今年二季度末亏损近4亿,你能指望它多厉害?).财产险公司—众安推出“尊享e生”中高端医疗保险(财险公司经营中高端医疗真的很厉害?真的是中高端医疗险 ...

  4. XCActionBar 「Xcode 中的 Alfred」

    下载地址:https://github.com/pdcgomes/XCActionBar 基本命令: (1)「command+shift+8」或者双击「command」键可以打开「动作输入框窗口」 ( ...

  5. Git 执行 「fork 出来的仓库」和「最新版本的原仓库」内容同步更新

    当我们在 GitHub 上 fork 出一个仓库后,如果原仓库更新了,此时怎样才能保证我们 fork 出来的仓库和原仓库内容一致呢?我们一般关注的是仓库的 master(主干分支)的内容,通过以下步骤 ...

  6. 翻译「C++ Rvalue References Explained」C++右值引用详解 Part1:概述

    本文系对「C++ Rvalue References Explained」 该文的翻译,原文作者:Thomas Becker. 该文较详细的解释了C++11右值引用的作用和出现的意义,也同时被Scot ...

  7. 苹果搜索广告后台大揭秘,最全最细致详解,手把手设置教程「后附官方视频」-b

    WWDC2016 搜索广告分会视频和 PPT 发布了,ASO100 带开发者第一时间了解 Search Ads 后台设置(文末有原声视频). 首先介绍一下搜索广告的模式和竞价规则 广告模式为 CPT( ...

  8. 被「李笑来老师」拉黑之「JavaScript微博自动转发的脚本」

    故事的背景如下图,李笑来 老师于10月19日在 知乎Live 开设 一小时建立终生受用的阅读操作系统 的讲座,他老人家看到大家伙报名踊跃,便在微博上发起了一个 猜数量赢取iPhone7 的活动. 因为 ...

  9. iOS模式详解—「runtime面试、工作」看我就 🐒 了 ^_^.

    Write in the first[写在最前] 对于从事 iOS 开发人员来说,当提到 ** runtime时,我想都可以说出来 「runtime 运行时」和基本使用的方法.相信很多开发者跟我当初一 ...

  10. iOS 模式详解—「runtime面试、工作」看我就 🐒 了 ^_^.

    引导 Copyright © PBwaterln Unauthorized shall not be *copy reprinted* . 对于从事 iOS 开发人员来说,所有的人都会答出「runti ...

随机推荐

  1. Jackson前后端开发模式必备json利器

    前言 json是我们现代互联网程序最常用的交互格式,是否你在工作中会遇到前端说字段不一致需要改的需求,是否遇到过数据库字段名与javaBean的规范不同,是否遇到过json与javaBean相互转换时 ...

  2. go 常用命令总结

    转载请注明出处: go build:编译包和依赖项,生成可执行文件.命令用于编译包和依赖项,生成可执行文件.当对Go程序进行修改后,需要使用go build命令重新编译程序,以生成新的可执行文件.该命 ...

  3. V8是如何执行JavaScript代码的?

    前言 一般来讲,电脑是不能直接运行我们的javascript代码的,它需要一个翻译程序将人类能够理解的编程语言 JavaScript,翻译成机器能够理解的机器语言.目前市面上有很多种 JavaScri ...

  4. 【Java学习】 Spring的基础理解 IOC、AOP以及事务

    一.简介     官网: https://spring.io/projects/spring-framework#overview     官方下载工具: https://repo.spring.io ...

  5. 5 大数据实战-hive实战分析

    1 内部表 Show databses; Use hive_data; 1.1 创建内部表 CREATE TABLE SOGOUQ2(DT STRING,WEBSESSION STRING,WORD ...

  6. ClickHouse数据表迁移实战之-remote方式

    1 引言 ClickHouse是一个用于联机分析(OLAP)的列式数据库管理系统(DBMS).我们内部很多的报表.数据看板都基于它进行开发.今天为大家带来remote方式的ClickHouse数据表迁 ...

  7. P3574 [POI2014] FAR-FarmCraft 吐槽 + 题解

    洛谷上面的题解写的真的不太好,有很多错误,我来谈谈自己的理解. 设 \(f[i]\) 表示以 \(i\) 为根节点的子树中(包括节点 \(i\))的所有人安装好游戏所需要的时间(与下面的 \(g[i] ...

  8. 【Shell】ps 命令

    ps 命令 Linux ps (英文全拼:process status)命令用于显示当前进程的状态,类似于 windows 的任务管理器. 1. ps 常用的命令 ps -aux #显示所有进程信息 ...

  9. 原生poi实现模版导出

    背景 我们公司是内网开发,外网jar包我的权限不够,所以easyexcel jar包无法使用,参考了easyexcel的填充思想,写了一个较简单的填充方法,如果直接用easyexcel的话,可以参考这 ...

  10. 二进制安装K8S

    参考链接:https://zhuanlan.zhihu.com/p/408967897 准备工作 3台Centos7.9虚拟机 虚拟机配置:2C4G,能连接外网 虚机规划 ip 用途 192.168. ...