CF1610F F. Mashtali: a Space Oddysey
我们首先发现有如下性质:
我们不妨先随机定向边,那么我们发现无论我们如何翻转边。
都会对其两端的点,造成 \(2 / 4\) 的影响,所以我们发现如果一个点其和他相连的所有边权和为偶数,则我们不能调整其为好点。
那么我们自然的思考,是否能够构造一种方案使得所有边权和为奇数的都可以成为好点。
我们下列先给出一个方案再进行一个证明。
我们对所有的奇度点都与一个虚点相连一条边权为 \(1\) 的虚边。
我们知道一条边会同时改变两点的度数奇偶情况,即奇度数点为偶数。
所以我们操作之后一定所有点都是偶数,那这图是一个欧拉回路。
考虑我们在进行欧拉回路的遍历时,我们首先满足让出边让入边的边权相等,否则使用另一边。
考虑对边权为偶数的我们可以任意定向,那我们不进行考虑。
那么我们考虑边权为奇数的,那么有两种情况。
一:奇数条边权为 \(1\) 的边,奇数条的边权边权为 \(2\) 的边。
此种情况,我们按我们的操作的一定会最后只会抵消到只剩一条边权为 \(1\) 的和一条边权为 \(2\) 的边。
那么其为好点。
一:奇数条边权为 \(1\) 的边,偶数条的边权边权为 \(2\) 的边。
此种情况,我们按我们的操作的一定会最后只会抵消到只剩一条边权为 \(1\)。
那么其为好点。
所以我们只要按照这种操作即可使得所有边权和的奇数的点都是好点。
#include<iostream>
#include<cstdio>
#include<vector>
#include<queue>
#include<list>
#define ll lonng long
#define N 600005
bool begin;
int n,m;
int to[N];
int from[N];
int sum[N];
int fans,ans[N];
int vis[N];
int cnt[N];
std::vector<int>Q[N][3];//边权为1,边权为2
int head[N][3];
int dfn[N];
bool end;
inline void dfs(int u,int now){
// std::cout<<u<<" "<<now<<std::endl;
// std::cout<<"rest"<<head[u][now]<<" "<<head[u][3 - now]<<std::endl;
int fnow = now;
while(!(Q[u][now].size() <= head[u][now] && Q[u][3 - now].size() <= head[u][3 - now])){
dfn[u] = 1;
while(head[u][now] < Q[u][now].size() && vis[Q[u][now][head[u][now]]])
head[u][now] ++;
while(head[u][3 - now] < Q[u][3 - now].size() && vis[Q[u][3 - now][head[u][3 - now]]])
head[u][3 - now] ++;
if(Q[u][now].size() != head[u][now]){
ans[Q[u][now][head[u][now]]] = (u == from[Q[u][now][head[u][now]]]) + 1;
vis[Q[u][now][head[u][now]]] = 1;
// std::cout<<"("<<u<<"->"<<" "<<(to[Q[u][now][head[u][now]]] - u)<<")"<<std::endl;
// std::cout<<Q[u][now].front()<<std::endl;
dfs(to[Q[u][now][head[u][now]]] - u,now);
head[u][now] ++ ;
}else{
now = 3 - now;
if(Q[u][now].size() != head[u][now]){
ans[Q[u][now][head[u][now]]] = (u == from[Q[u][now][head[u][now]]]) + 1;
vis[Q[u][now][head[u][now]]] = 1;
// std::cout<<"("<<u<<"->"<<" "<<(to[Q[u][now][head[u][now]]] - u)<<")"<<std::endl;
// std::cout<<Q[u][now].front()<<std::endl;
dfs(to[Q[u][now][head[u][now]]] - u,now);
head[u][now] ++ ;
}
}
now = fnow;
}
return ;
}
int main(){
// std::cout<<(&end - &begin) / 1024 / 1024<<std::endl;
scanf("%d%d",&n,&m);
for(int i = 1;i <= m;++i){
int x,y,p;
scanf("%d%d%d",&x,&y,&p);
to[i] = x + y;
cnt[x] ++ ;
cnt[y] ++ ;
from[i] = x;
sum[x] += p;
sum[y] += p;
Q[x][p].push_back(i);
Q[y][p].push_back(i);
}
int mcnt = m;
for(int i = 1;i <= n;++i){
if(sum[i] & 1)
fans ++ ;
if(cnt[i] & 1){
int x = n + 1;
int y = i;
int p = 1;
to[++mcnt] = x + y;
from[mcnt] = x;
Q[x][p].push_back(mcnt);
Q[y][p].push_back(mcnt);
}
}
for(int i = 1;i <= n + 1;++i)
if(!dfn[i])
dfs(i,1);
std::cout<<fans<<std::endl;
for(int i = 1;i <= m;++i)
std::cout<<(ans[i]);
return 0;
}
CF1610F F. Mashtali: a Space Oddysey的更多相关文章
- 列表屏幕(List Screen)
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- ES5基础之正则表达式02:范围类、预定义类和边界字符
1.范围类 //元字符 /* * 正则表达式由两种基本字符类型组成 * 1.原义文本字符:例如123abc * 2.元字符:元字符是在正则表达式中有特殊含义的非字母字符 */ //常见特殊符号:. * ...
- mac 系统通用快捷键(mac 下的应用多数会往这些标准看齐)(转:http://yang3wei.github.io/blog/2013/02/08/chen-ni-yu-mac-chen-ni-yu-xcode/)
command + w: 关闭当前窗口 command + q: 退出程序 (Google Chrome 有点奇葩,按下之后还需要hold 那么一小会儿才能退出) command + m: 最小化当前 ...
- 获取windows磁盘的可用空间函数
<?php /* *获取某个磁盘的剩余空间 *$param 关联数组,下标是哪个盘,单位,可以是B,KB,MB,GB *可以设置获取多个磁盘,例如:array('C'=>'KB','D'= ...
- web前端开发工具HBuilder使用技巧之快捷键
/*注:本教程针对HBuilder5.0.0,制作日期2014-12-31*/ 创建HTML结构: h 8 (敲h激活代码块列表,按8选择第8个项目,即HTML代码块,或者敲h t Enter) 中途 ...
- Half Wavelength Dipole Antenna
Reference : 1. wikipedia The dipole antenna is the simplest and most widely used class of antenna.It ...
- ocp 1Z0-042 61-120题解析
61. View the Exhibit.Which statement regarding the dept and emp tables is true?A) When you delete a ...
- hbuilder工具快捷键 http://www.qq210.com/shoutu/android
http://www.qq210.com/shoutu/android 创建HTML结构: h 8 (敲h激活代码块列表,按8选择第8个项目,即HTML代码块,或者敲h t Enter)中途换行: ' ...
- windbg命令详解
DLL 该扩展仅在内核模式下使用,即使它是在Ext.dll中的. Windows NT 4.0 Ext.dll Windows 2000 Ext.dll Windows XP和之后 Ext.dll ...
随机推荐
- Java(4)运算符及表达式
作者:季沐测试笔记 原文地址:https://www.cnblogs.com/testero/p/15201675.html 博客主页:https://www.cnblogs.com/testero ...
- 攻防世界XCTF-WEB入门全通关
为了更好的体验,请见我的---->个人博客 XCTF的web块入门区非常简单,适合一些刚接触安全或者对网络安全常识比较了解的同学在安全搞累之余娱乐娱乐. 其主要考察下面几点: 基本的PHP.Py ...
- .Net微信服务商平台ApiV3接口
最近做个对接微信服务商平台的小程序项目,大概要实现的流程是:a)特约商户进件 > b)生成带参数的小程序码 > c)小程序支付 > d)分账,记录一下,希望能对需要的朋友有所帮助 开 ...
- 网络通信IO的演变过程(一)(一个门外汉的理解)
以前从来不懂IO的底层,只知道一个大概,就是输入输出的管道怼到一起,然后就可以传输数据了. 最近看了周志垒老师的公开课后,醍醐灌顶. 所以做一个简单的记录. 0 计算机组成原理相关 0.1. 计算机的 ...
- 写了10000条Airtest截图脚本总结出来的截图经验,赶紧收藏!
前言 今天想先给大家分享1个小白用户的Airtest从入门到放弃的故事: 小A是一个自动化的小白,在逛测试论坛的时候,偶然间发现了Airtest这个基于图像识别的UI自动化框架. 出于好奇,小A试用了 ...
- [软工顶级理解组] Beta阶段项目展示
目录 团队成员 软件介绍 项目简介 预期典型用户 功能描述 预期目标用户数 用户反馈 团队管理 分工协作 项目管理 取舍平衡 代码管理 程序测试 代码规范 文档撰写 继续开发指导性 用户沟通 需求分析 ...
- 设置nginx进程可打开最大的文件数
涉及到的nginx配置参数: worker_processes: 表示操作系统启动多少个工作进程在运行,一般这个参数设置成CPU核数的倍数 worker_connections:表示nginx的工作进 ...
- Maven还停留在导jar包?快来探索Nexus私服的新世界
写在前面 Maven,学习框架之前我们都会接触到的一个工具,感觉他的定位,似乎就跟git一样,只是方便我们开发?于是自然而然的,很多小猿对于Maven都只是停留在会用的阶段,利用他来构建,打包,引入j ...
- 实验6:开源控制器实践——RYU
实验目的 能够独立部署RYU控制器 能够理解RYU控制器实现软件定义的集线器原理 能够理解RYU控制器实现软件定义的交换机原理 二.实验环境 下载虚拟机软件Oracle VisualBox或VMwar ...
- linux下创建文件的文件权限问题
今天发现创建文件的权限和自己规定的权限不一致,了解到了权限掩码的问题,这里总结一下. 首先权限掩码umask是chmod配套的,总共为4位(gid/uid,属主,组权,其它用户的权限),不过通常我们都 ...