51nod 1967路径定向(欧拉回路)
2024-08-28 12:51:06
题目大意:给出一个图,安排边的方向,使得入度等于出度的点数最多,并给出方案。
首先假设是个无向图,不妨认定偶点必定可以满足条件
我们还会发现,奇点的个数必定是偶数个
那么如果把奇点两两用辅助边连起来,对全图求一个欧拉回路,就可以得到这个方案
因为奇点肯定不会是答案点,所以奇点连起来不会有影响
这时的欧拉回路就可以保证所有偶点满足入度等于出度
这里为了简便,写的是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('');
}
}
最新文章
- Spring MVC篇一、搭建Spring MVC框架
- PHP用法
- 前端实战——前端效果accordition的实现
- 初学Android 一 基本开发环境
- sql中的触发器、视图、事务
- Windows 7 64位下解决不能创建Django项目问题
- 自定义按照index和key访问的List
- 浅谈MySql的存储引擎(表类型) (转)
- Nginx负载均衡策略
- 【Atom】在一个中/大型项目中,那些好用而强大的atom功能
- ABP Zero示例项目问题总结
- 最简单的 nginx 负载均衡,只能演示,企业中最好不用
- JS----对象的合并与克隆
- CentOS搭建FTP服务
- 64位 windows10下 Apache2.4 + php7 + phpstorm 相关设置
- 通过shell查找访问日志中访问量最大的ip
- 小程序点击跳转外部链接 微信小程序提示:不支持打开非业务域名怎么办 使用web-view 配置业务域名
- ASP.net学习总结
- 20155327 李百乾 Exp4 恶意代码分析
- torch.Tensor.view (Python method, in torch.Tensor)