我们首先发现有如下性质:

我们不妨先随机定向边,那么我们发现无论我们如何翻转边。

都会对其两端的点,造成 \(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的更多相关文章

  1. 列表屏幕(List Screen)

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  2. ES5基础之正则表达式02:范围类、预定义类和边界字符

    1.范围类 //元字符 /* * 正则表达式由两种基本字符类型组成 * 1.原义文本字符:例如123abc * 2.元字符:元字符是在正则表达式中有特殊含义的非字母字符 */ //常见特殊符号:. * ...

  3. 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: 最小化当前 ...

  4. 获取windows磁盘的可用空间函数

    <?php /* *获取某个磁盘的剩余空间 *$param 关联数组,下标是哪个盘,单位,可以是B,KB,MB,GB *可以设置获取多个磁盘,例如:array('C'=>'KB','D'= ...

  5. web前端开发工具HBuilder使用技巧之快捷键

    /*注:本教程针对HBuilder5.0.0,制作日期2014-12-31*/ 创建HTML结构: h 8 (敲h激活代码块列表,按8选择第8个项目,即HTML代码块,或者敲h t Enter) 中途 ...

  6. Half Wavelength Dipole Antenna

    Reference : 1. wikipedia The dipole antenna is the simplest and most widely used class of antenna.It ...

  7. ocp 1Z0-042 61-120题解析

    61. View the Exhibit.Which statement regarding the dept and emp tables is true?A) When you delete a ...

  8. hbuilder工具快捷键 http://www.qq210.com/shoutu/android

    http://www.qq210.com/shoutu/android 创建HTML结构: h 8 (敲h激活代码块列表,按8选择第8个项目,即HTML代码块,或者敲h t Enter)中途换行: ' ...

  9. windbg命令详解

      DLL 该扩展仅在内核模式下使用,即使它是在Ext.dll中的. Windows NT 4.0 Ext.dll Windows 2000 Ext.dll Windows XP和之后 Ext.dll ...

随机推荐

  1. 蝉知CMS 7.X XSS漏洞复现

    个人博客地址:xzajyjs.cn 作为一个开源的企业门户系统(EPS), 企业可以非常方便地搭建一个专业的企业营销网站,进行宣传,开展业务,服务客户.蝉知系统内置了文章.产品.论坛.评论.会员.博客 ...

  2. OSI模型与TCP/IP模型

    OSI模型与TCP/IP模型 OSI参考模型: ​ ---开放式系统互联参考模型 OSI/RM ISO ---国际标准化组织 --1979 应用层 ---- 通过应用进程间的交互来完成特定网络应用 表 ...

  3. python常用功能

    1. 获取昨天日期 引入datetime模块 import datetime def getYesterday(): today = datetime.date.today() #返回当前本地日期 # ...

  4. SpringBoot 整合 Thymeleaf & 如何使用后台模板快速搭建项目

    如果你和我一样,是一名 Java 道路上的编程男孩,其实我不太建议你花时间学 Thymeleaf,当然他的思想还是值得借鉴的.但是他的本质在我看来就是 Jsp 技术的翻版(Jsp 现在用的真的很少很少 ...

  5. [对对子队]会议记录4.10(Scrum Meeting 1)

    本次每日例会的开会时间是4月10日晚上20:00,使用腾讯会议作为开会工具. 今天已完成的工作 何瑞 ​ 工作内容:制作UI界面的指令编辑系统,已大致实现指令的衔接 ​ 相关issue:实现用户指令编 ...

  6. BUAA 软工 | 从计算机技术中探索艺术之路

    项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 第一次作业-热身! 我在这个课程的目标是 掌握软件开发方法学和工程学知识 这个作业在哪个具体方面帮 ...

  7. Prometheus重新标记

    Prometheus重新标记 一.背景 二.简化的指标抓取的生命周期 1.配置参数详解 1.`action:`存在的值 1.替换标签值 2.删除指标 3.创建或删除标签 2.删除标签注意事项 3.几个 ...

  8. AFO记

    希望永远也不要动笔写这个. 发以自勉

  9. hdu 1394 Minimum Inversion Number(线段树or树状数组)

    题意: 给你N个数,N个数是0~N-1的一个全排列. 要求统计它的所有形式的逆序对的最小值.它的所有形式的意思是,不断将数组开头的第一个数放到数组的最后面. 逆序对:i<j且ai>aj 思 ...

  10. 跟着老猫来搞GO,集跬步而致千里

    上次博客中,老猫已经和大家同步了如何搭建相关的GO语言的开发环境,相信在车上的小伙伴应该都已经搞定了环境了.那么本篇开始,我们就来熟悉GO语言的基础语法.本篇搞定之后,其实期待大家可以和老猫一样,能够 ...