题目大意:给出一个图,安排边的方向,使得入度等于出度的点数最多,并给出方案。

首先假设是个无向图,不妨认定偶点必定可以满足条件

我们还会发现,奇点的个数必定是偶数个

那么如果把奇点两两用辅助边连起来,对全图求一个欧拉回路,就可以得到这个方案

因为奇点肯定不会是答案点,所以奇点连起来不会有影响

这时的欧拉回路就可以保证所有偶点满足入度等于出度

这里为了简便,写的是dfs出欧拉道路,因为欧拉道路同样可以满足要求

#include <iostream>
#include <cstring>
#include <cstdio>
#include <vector>
#define fi first
#define se second
using namespace std;
typedef pair<int, int> PII;
const int maxn = 1e6 + ;
int du[maxn], f[maxn];
vector<PII> edges;
vector<int> G[maxn], V;
int n, m, x, y; void dfs(int x){
for(auto i : G[x]){
if(f[i]) continue;
auto e = edges[i];
if(e.fi != x) f[i] = ;
else f[i] = ;
dfs(e.fi == x ? e.se : e.fi);
}
} int main()
{
cin>>n>>m;
for(int i = ; i < m; i++){
scanf("%d %d", &x, &y);
edges.push_back({x, y});
G[x].push_back(i);
G[y].push_back(i);
du[x]++; du[y]++;
}
for(int i = ; i <= n; i++) if(du[i]&) V.push_back(i);
int M = m;
for(int i = ; i < V.size(); i += ){
x = V[i];
y = V[i+];
edges.push_back({x, y});
m++;
G[x].push_back(m-);
G[y].push_back(m-);
}
for(int i = ; i <= n; i++) dfs(i);
cout<<n - V.size()<<endl;
for(int i = ; i < M; i++){
if(f[i] == ) putchar('');
else putchar('');
}
}

最新文章

  1. Spring MVC篇一、搭建Spring MVC框架
  2. PHP用法
  3. 前端实战——前端效果accordition的实现
  4. 初学Android 一 基本开发环境
  5. sql中的触发器、视图、事务
  6. Windows 7 64位下解决不能创建Django项目问题
  7. 自定义按照index和key访问的List
  8. 浅谈MySql的存储引擎(表类型) (转)
  9. Nginx负载均衡策略
  10. 【Atom】在一个中/大型项目中,那些好用而强大的atom功能
  11. ABP Zero示例项目问题总结
  12. 最简单的 nginx 负载均衡,只能演示,企业中最好不用
  13. JS----对象的合并与克隆
  14. CentOS搭建FTP服务
  15. 64位 windows10下 Apache2.4 + php7 + phpstorm 相关设置
  16. 通过shell查找访问日志中访问量最大的ip
  17. 小程序点击跳转外部链接 微信小程序提示:不支持打开非业务域名怎么办 使用web-view 配置业务域名
  18. ASP.net学习总结
  19. 20155327 李百乾 Exp4 恶意代码分析
  20. torch.Tensor.view (Python method, in torch.Tensor)

热门文章

  1. Vue 2.0 组件库总结
  2. 浅谈C#实现Web代理服务器的几大步骤
  3. spark-day1
  4. PrestaShop 网站漏洞修复如何修复
  5. SIMD数据并行(四)——三种结构的比较
  6. 20145202马超 实验二《Java面向对象程序设计》实验报告
  7. Python标准库--inspect
  8. Ubantu修改主机名详细步骤
  9. Java - 问题集 - 导出csv文件中文乱码
  10. ORA-12546: TNS: 权限被拒绝(ORA - 12546 TNS: Permission Denied)