【JZOJ4672】Graph Coloring【模拟】【搜索】

【USACO3.1.5】【洛谷P2724】联系 Contact【模拟】 USACO的一道质量较高的模拟题 阅读详情

题目大意:

题目链接:https://jzoj.net/senior/#main/show/4672
现在你有一张无向图包含 n n n个节点 m m m条边。最初,每一条边都是蓝色或者红色。每一次你可以将一个节点连接的所有边变色(从红变蓝,蓝变红)。
找到一种步数最小的方案,使得所有边的颜色相同。


思路:

记得以前做过费解的开关这道题,发现两道题蛮像的。
于是就用同样的思路去思考。
可以考虑先枚举其中一个点选择或不选择,以及最终要改成哪个颜色。如果我们已经把一条边上一个点修改了,那么如果要把这条边再次改回来,就只能把两另外一个点选择。但是你选择了这个点之后,又会有新的边被修改,然后依次类推。
所以,可以用一遍搜索来处理。如果经过若干次修改之后全部边都变成了一个颜色,那么就更新答案。


代码:

#include <cstdio>
#include <queue>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;

const int N=100010;
const int Inf=1e9;
int n,m,x,y,ans1,ans2,tot=1,head[N],father[N];
bool vis[N],used[N];
char ch;

struct edge
{
	int next,to,col;
}e[N*2],a[N*2],b[N*2];

int find(int x)
{
	return x==father[x]?x:father[x]=find(father[x]);
}

void add(int from,int to,int c)
{
	e[++tot].to=to;
	e[tot].col=c;
	e[tot].next=head[from];
	head[from]=tot;
}

bool check(int col)
{
	for (register int i=2;i<=tot;i++)
		if (a[i].col!=col) return 0;
	return 1;
}

int work1(int S,int col,int change)
{
	memset(vis,0,sizeof(vis));
	queue<int> q;
	vis[S]=1;
	int cnt=change;
	for (register int i=head[S];~i;i=a[i].next)
	{
		if (change)
			a[i].col^=1,a[i^1].col^=1;
		q.push(i);
	}
	while (q.size())
	{
		int j=q.front();
		q.pop();
		int u=a[j].to;
		vis[u]=1;
		if (a[j].col!=col)
		{
			cnt++;
			for (register int i=head[u];~i;i=a[i].next)
			{
				a[i].col^=1;
				a[i^1].col^=1;
				int v=a[i].to;
				if (vis[v]&&a[i].col!=col)
					return Inf;
				if (!vis[v]) q.push(i);
			}
		}
		else
		{
			for (register int i=head[u];~i;i=a[i].next)
			{
				int v=a[i].to;
				if (vis[v]&&a[i].col!=col)
					return Inf;
				if (!vis[v]) q.push(i);
			}
		}
	}
	return cnt;
}

int work2(int S,int col,int change)
{
	memset(vis,0,sizeof(vis));
	queue<int> q;
	vis[S]=1;
	int cnt=change;
	for (register int i=head[S];~i;i=b[i].next)
	{
		if (change)
			b[i].col^=1,b[i^1].col^=1;
		q.push(i);
	}
	while (q.size())
	{
		int j=q.front();
		q.pop();
		int u=b[j].to;
		vis[u]=1;
		if (b[j].col!=col)
		{
			cnt++;
			for (register int i=head[u];~i;i=b[i].next)
			{
				b[i].col^=1;
				b[i^1].col^=1;
				int v=b[i].to;
				if (vis[v]&&b[i].col!=col)
					return Inf;
				if (!vis[v]) q.push(i);
			}
		}
		else
		{
			for (register int i=head[u];~i;i=b[i].next)
			{
				int v=b[i].to;
				if (vis[v]&&b[i].col!=col)
					return Inf;
				if (!vis[v]) q.push(i);
			}
		}
	}
	return cnt;
}

int main()
{
	memset(head,-1,sizeof(head));
	scanf("%d%d",&n,&m);
	for (register int i=1;i<=n;i++)
		father[i]=i;
	for (register int i=1;i<=m;i++)
	{
		scanf("%d%d",&x,&y);
		father[find(x)]=find(y);
		while ((ch=getchar())&&ch!='R'&&ch!='B') ;
		if (ch=='R')
		{
			add(x,y,1);
			add(y,x,1);
		}
		else
		{
			add(x,y,0);
			add(y,x,0);
		}
	}
	memcpy(a,e,sizeof(e));
	memcpy(b,e,sizeof(e));
	for (register int i=1;i<=n;i++)
		if (!used[find(i)])
		{
			int fa=find(i);
			used[fa]=1;
			ans1+=min(work1(fa,1,0),work2(fa,1,1));
			if (ans1>=Inf) break;
		}
	memset(used,0,sizeof(used));
	memcpy(a,e,sizeof(e));
	memcpy(b,e,sizeof(e));
	for (register int i=1;i<=n;i++)
		if (!used[find(i)])
		{
			int fa=find(i);
			used[fa]=1;
			ans2+=min(work1(fa,0,0),work2(fa,0,1));
			if (ans2>=Inf) break;
		}
	if (ans1>=Inf&&ans2>=Inf) printf("-1");
		else printf("%d",min(ans1,ans2));
	return 0;
}
避坑指南:Qgis等时圈分析中ORS插件Key申请与参数设置的常见错误 本文详细解析了QGIS等时圈分析中ORS插件从API密钥申请到参数优化的全流程避坑指南。针对密钥激活、出行模式选择、时空参数设置等七个高频故障点,提供了实用的调试方案和优化技巧,帮助用户高效完成空间可达性分析。 阅读详情

相关推荐

Zynq 双核AMP 通信

4、配置离线编译(这里不讲),配置linux的内核地址空间(0x4000_0000改为0x2000_0000),以及单核启动。CPU1设置为0x2000_0000~0x3FFF_FFFF(也可以小于0x3FFF_FFFF)如果禁用CPU1的L2 cache,在CPU1的bsp里面添加编译时候所需要的宏。3、配置工程,将vivado产生的.xsa文件复制到amp_com项目目录下。9、使用petalinux-package --boot 打包。一、vivado工程。5、编译u-boot。

y183128184的博客 1086

#AIM Tech Round [div2] C. Graph and String 【连通图、染色】

题目: C. Graph and String time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output One day student Vasya was sitt

算法本子 6750

华为云HCS解决方案笔记HUAWEI CLOUD Stack【面试篇】

华为云解决方案介绍、华为云服务介绍,华为云网络平面规划等

weixin_48375618的博客 1万+

【CF 662B】Graph Coloring

Description现在你有一张无向图包含n个节点m条边。最初,每一条边都是蓝色或者红色。每一次你可以将一个节点连接的所有边变色(从红变蓝,蓝变红)。 找到一种步数最小的方案,使得所有边的颜色相同。Solution一开始看到这题,之前好像做过类似的题目,不过是在序列上的…… 想了半天,啊,每个点最多只会被翻转一次:为什么呢,翻转两次会与不翻转的情况一样,翻转三次会与翻转一次的情况一样,最终翻奇

Facico的博客 1434

从零构建物联网数据中台:MQTT协议、Node.js服务、MongoDB与InfluxDB双存储及React可视化实战

本文详细介绍了从零构建物联网数据中台的完整实战方案。通过采用MQTT协议作为设备通信标准,结合Node.js搭建高并发数据处理服务,并创新性地使用MongoDB与InfluxDB双存储架构分别管理设备元数据与海量时序数据,最后利用React构建了实时数据可视化控制台。该架构有效解决了物联网项目中数据异构、查询性能低下等核心痛点,为构建高效、可扩展的物联网平台提供了清晰路径。

weixin_28432777的博客 288

VMware ESXi +DELL虚拟化存储磁盘容量处于紧急状态问题的处理

1、环境介绍 exsi server两台(DELL R730 ): 192.168.3.206 VMware EXSi6.5 192.168.3.207 VMware EXSi6.5 磁盘存储柜一台(DELL SC2000): 192.168.3.208 2、故障处理 由于前期规划的卷空间过大,虚拟机文件逐年增大以后,造成卷的磁盘占用过与整个磁盘空间的容量,虚拟化平台可用容量爆掉,DELL SC2000自动切换到紧急状态,禁止所有磁盘I/O,exsi主机上的虚拟机无法开机 首先,安装

wolf1105的博客 3530

jzoj 4672. 【NOIP2016提高A组模拟7.20】Graph Coloring

Description 现在你有一张无向图包含n个节点m条边。最初,每一条边都是蓝色或者红色。每一次你可以将一个节点连接的所有边变色(从红变蓝,蓝变红)。 找到一种步数最小的方案,使得所有边的颜色相同。 Input 第一行包含两个数n,m(1<=n,m<=100000)分别代表节点数和边的数量 接下来m行描述边,第i行ui,vi,ci,代表ui有一条颜色为ci的边与vi相连(ci是B或...

Larry1118的博客 267

2022网安保研经验帖

2022网安保研经验

fumingxiaoshen的博客 4894

长按开关机芯片原理与工程实践:以ECJ231040-151A-2B5B为例

长按开关机芯片是便携式锂电池设备中保障启动可靠性的关键硬件模块,其本质是将机械按键的非理想行为(抖动、误触、回弹)转化为确定性数字指令的专用状态机。工作原理基于片上RC振荡器+分频计数器实现毫秒级精度的延时判定,技术价值在于剥离MCU负担、实现硬件级抗干扰与死机容错,显著提升产品量产良率与低温/高湿等恶劣工况下的启动一致性。典型应用场景包括TWS充电仓、工业传感器节点、儿童早教机等空间受限且可靠性优先的嵌入式终端。本文深入解析ECJ231040‑151A‑2B5B在SOT23‑6封装约束、锂电池电压窗口适配

weixin_33842304的博客 332

在Visual Studio中搭建Dynamo Python开发环境,效率飞一般的增长

在Visual Studio中搭建Dynamo Python开发环境,效率飞一般的增长

BIM的乐趣 1728

面向业务角色的 SAP Fiori Space 与 Page 创建全流程实战指南

业务角色导航设计:从Space与Page规划到实施 摘要:本文探讨了SAP S/4HANA Cloud和BTP ABAP环境中基于业务角色的导航设计方法。传统Fiori Launchpad的Group+Tile模式存在应用堆积问题,而新的Space与Page模型将导航按工作领域(如应付会计、销售代表)组织,每个Space包含多个任务导向的Page。文章详细介绍了从业务角色建模到Space/Page创建、分配的完整流程,包括核心概念解析、规划思路和具体操作步骤。重点阐述了如何根据业务需求选择创建方式(基于预交

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 182

【Codeforces662B】【Graph Coloring】

题目大意给出一个图,边有两种颜色,可以改变一个点相连边的颜色,都取反,求最少改变多少个点使得全部边颜色一样。解题思路可以发现一个点最多改变一次,由于只有两种颜色,一条边只和两个点有关,知道一个点必可求出另一个点的状态,可以暴力求解,具体怎么暴力可以看代码,注意可能有多个连通块。code#include<set> #include<cmath> #include<cstdio> #include<cs

inklutcuah’s blog 747

【YOLO11改进 - C3k2融合】C3k2融合DWRSeg二次创新C3k2_DWR:扩张式残差分割网络,提高特征提取效率和多尺度信息获取能力,助力小目标检测

【YOLO11改进 - C3k2融合】C3k2DWRSeg二次创新C3k2_DWR:扩张式残差分割网络,提高特征提取效率和多尺度信息获取能力,助力小目标检测

专注于图像领域,主要研究内容包括计算机视觉和深度学习,特别是在图像分类、目标检测和图像生成等方面有深入的研究和实践经验。 1054

JZOJ 4672. 【NOIP2016提高A组模拟7.20】Graph Coloring

233题目:题意:分析:代码: 题目: 传送门 题意: 每次可选择一个点,对连接该点的所有边进行变色 求将整个图变为同一颜色最少需要多少步 分析: 我们可以将此图转换为010101染色图,对于红蓝两色,先假设整图为一种,然后对所有边进行变色,再变为另一种颜色 而判断是否可以变色,可以用dfsdfsdfs来暴力模拟 代码: #include<iostream> #include&...

qq_35786326的博客 174

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

JZOJ 4672.【提高A组模拟赛 T2】 Graph Coloring

题目大意: 现在你有一张无向图包含n个节点m条边。最初,每一条边都是蓝色或者红色。每一次你可以将一个节点连接的所有边变色(从红变蓝,蓝变红)。 找到一种步数最小的方案,使得所有边的颜色相同。如果没有方案输出-1 解题思路: 可以设目的为蓝色然后搜索,如果当前点选过一次就说明没有方案 接着将所有边权取反(将目的换成红色)进行同样操作 Accepted/code:Accepted/ code:Acce...

owo 245

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Graph Coloring【NOIP2016提高A组模拟7.20】

题目:现在你有一张无向图包含n个节点m条边。最初,每一条边都是蓝色或者红色。每一次你可以将一个节点连接的所有边变色(从红变蓝,蓝变红)。 找到一种步数最小的方案,使得所有边的颜色相同。样例输入: 第一行包含两个数n,m分别代表节点数和边的数量 接下来m行描述边,第i行ui,vi,ci,代表ui有一条颜色为ci的边与vi相连(ci是B或者是R),B代表蓝色,R代表红色。数据保证没有自环的边。

Last_Freezen_yue的博客 551

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

jzoj4672-Graph Coloring【图论,模拟】

正题 题目大意 一张无向图,每条边有一个颜色(红或蓝),可以选择点使得连接的边都取反,求至少要选多个点可以使得所有边的颜色相同。 解题思路 不难发现如果确定所有边的颜色,然后知道一个点的颜色后就可以知道整个联通图的颜色。因为如果一个点的颜色被确定了,他连接的点的颜色也可以被确定。 codecodecode #include<cstdio> #include<algorith...

QuantAsk 612

poj1419Graph Coloring

Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 4379   Accepted: 1985   Special Judge Description You are to write a program that tries to find an optimal coloring for

Last Order 929

[jzoj 4672] [Codeforces 662B] Graph Coloring {bfs/染色问题}

题目 Description 现在你有一张无向图包含n个节点m条边。最初,每一条边都是蓝色或者红色。每一次你可以将一个节点连接的所有边变色(从红变蓝,蓝变红)。 找到一种步数最小的方案,使得所有边的颜色相同。 Input 第一行包含两个数n,m(1<=n,m<=100000)分别代表节点数和边的数量 接下来m行描述边,第i行ui,vi,ci,代表ui有一条颜色为ci的边与vi相连(ci...

Nowed 513

4672. 【NOIP2016提高A组模拟7.20】Graph Coloring

Description 现在你有一张无向图包含n个节点m条边。最初,每一条边都是蓝色或者红色。每一次你可以将一个节点连接的所有边变色(从红变蓝,蓝变红)。 找到一种步数最小的方案,使得所有边的颜色相同。 Input 第一行包含两个数n,m(1<=n,m<=100000)分别代表节点数和边的数量 接下来m行描述边,第i行ui,vi,ci,代表ui有一条颜色为ci的边与vi相连(ci...

zsjzliziyang的博客 224

弄提纲【NOIP2016提高A组模拟7.19】

题目:新日暮里中,比冲是一位博学的哲学教授。由于最近要帮学生准备考试,他决定弄个提纲给学生。然而同事van不服气,觉得这样学生就没有了自我思考,便在提纲中添加废话。 比冲很无奈,他想找回原稿。我们把现在的提纲看成是一个字符串S。他知道van只会在原稿结尾添加语句,也就是说,原稿是S的前缀。 现在比冲有m个询问,以此来找出原稿。每次给出两个位置l,r,问以l与r结尾的字符串中,有多少个字符串符合原

Last_Freezen_yue的博客 786

Jzoj P4672 Graph Coloring___01图染色+dfs

题目大意: 一张n个节点m条边的无向图。 最初,每一条边都是蓝色或者红色。 每一次你可以将一个节点连接的所有边变色(从红变蓝,蓝变红)。 找到一种步数最小的方案,使得所有边的颜色相同。 1&lt;=n,m&lt;=1000001&lt;=n,m&lt;=1000001<=n,m<=100000 没有自环的边 分析: 分别将边变为蓝色或者红色,然后取最优方...

生如夏花之绚烂 401

【搜索】JZOJ_4672 Graph Coloring

题意 给出一张图,上面的边都有蓝或红这两种颜色。选择一个点可以使得它连出的所有边的颜色变反,求选择的最少点数使得图的边只有一种颜色,如果不能满足只有一种颜色,输出-1。 思路 当我们选择一个点时,我们可以确定它连到的点需不需要选择,因为要保证边的颜色,所以我们可以默认一个颜色,然后搜索判断记录最少选择的点。 代码 #include<cstdio> #include<cstring...

GOODPLACE 229

【洛谷P4997】不围棋【并查集】【模拟】

题目大意: 题目链接:https://www.luogu.org/problemnew/show/P4997 「不围棋」是一种非常有趣的棋类游戏。 大家都知道,围棋的「气」是指一个棋子所在的联通块相邻的空格。两粒棋如果在棋盘上线段的两端就认为是相邻的,也就是在同一个连通块里。比如在图中,白子为四个独立的连通块,黑子构成一个连通块,绿色点是黑子连通块唯一的「气」: 「提子」是指将没有「气」的棋子提...

stoorz 5083

【JZOJ3888】正确答案【模拟】【dfs】

题目: 题目链接:https://jzoj.net/senior/#main/show/3888 小H与小Y刚刚参加完UOIP外卡组的初赛,就迫不及待的跑出考场对答案。 “吔,我的答案和你都不一样!”,小Y说道,”我们去找神犇们问答案吧”。 外卡组试卷中共有m道判断题,小H与小Y一共从其他n个神犇那问了答案。之后又从小G那里得知,这n个神犇中有p个考了满分,q个考了零分,其他神犇不为满分或零分。这...

stoorz 989

【JZOJ5775】农夫约的假期【模拟】

题目大意: 题目链接:https://jzoj.net/senior/#main/show/5775 题目图片: https://www.z4a.net/images/2018/09/23/1.png https://www.z4a.net/images/2018/09/23/2.md.png https://www.z4a.net/images/2018/09/23/3.png https://...

stoorz 793
上一篇: 【JZOJ4671】World Tour【最短路】
下一篇: 【洛谷P1993】小K的农场【差分约束】
stoorz1023
博客等级 码龄9年 101粉丝 595原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值