51nod 1967路径定向(dfs、欧拉回路)
给出一个有向图,要求给每条边重定向,使得定向后出度等于入度的点最多,输出答案和任意一种方案
第一行两个正整数N,M,表示1-N号点与M条边
接下来M行,每行两个正整数Xi,Yi,表示存在一条有向边从Xi指向Yi
N≤10^5, M≤3*10^5, Xi,Yi≤N
第一行一个整数Ans,表示定向后出度等于入度的最大点数
第二行一个长度为M的01字符串,第i位为0表示第i条边不改向,第i位为1表示第i条边改变方向
7 7
1 2
2 3
2 3
4 5
1 5
6 7
6 7
5
0010110
题解:奇点不可能入度等于出度,所以最大点数即偶点个数。因为奇点个数为偶数,可以将奇点相连使得都变为偶点,dfs求欧拉回路。
注意:这题卡时间,输出别用printf,用putchar
代码:
#include<bits/stdc++.h>
using namespace std;
const int M = 4e5+;
const int N = 1e5+;
vector<int>g[N];//每个点连哪些边
vector<int>a;//奇点
struct node {
int u, v;
}e[M];//每条边连哪些点
int vis[M];//走欧拉图时标记边状态,1保持不变,2改变方向
int du[N];//度数
void dfs(int x) {
int num = g[x].size();
for(int i = ; i < num; ++i) {
int j = g[x][i]; if(vis[j]) continue; int u = e[j].u;
if(u == x) vis[j] = ;
else vis[j] = ; //printf("%d:%d->%d...%d->%d\n",x, u, e[j].v, x, u==x?e[j].v:u);
if(u == x) dfs(e[j].v);
else dfs(u);
}
}
int main() {
int n, m, i, j, u, v;
scanf("%d%d", &n, &m);
memset(vis, , sizeof(vis));
memset(du, , sizeof(du));
for(i = ; i <= m; ++i) {
scanf("%d%d", &u, &v);
e[i].u = u;
e[i].v = v;
g[u].push_back(i);
g[v].push_back(i);
du[u]++; du[v]++;
}
for(i = ; i <= n; ++i) if(du[i]&) a.push_back(i);
int num = a.size();
printf("%d\n", n - num); int t = m;
for(i = ; i < num; i += ) {
e[++t].u = a[i];
e[t].v = a[i+];
g[a[i]].push_back(t);
g[a[i+]].push_back(t);
}
//puts("");
for(i = ; i <= n; ++i) dfs(i); for(i = ; i <= m; ++i) {
if(vis[i] == ) putchar('');
else putchar('');
}
puts("");
return ;
}
640ms
51nod 1967路径定向(dfs、欧拉回路)的更多相关文章
- 51nod 1967路径定向(欧拉回路)
题目大意:给出一个图,安排边的方向,使得入度等于出度的点数最多,并给出方案. 首先假设是个无向图,不妨认定偶点必定可以满足条件 我们还会发现,奇点的个数必定是偶数个 那么如果把奇点两两用辅助边连起来, ...
- 51Nod 1967 路径定向 —— 欧拉回路
题目:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1967 显然是欧拉回路问题,度数为奇数的点之间连边,跑欧拉回路就可以 ...
- 51nod 1967 路径定向(不错的欧拉回路)
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1967 题意: 思路: 出度=入度,这很容易想到欧拉回路,事实上,这道题目 ...
- 51nod 1967 路径定向——欧拉回路
题目:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1967 一共只会有偶数个奇数度的点.因为每多一条边,总度数加2. 把 ...
- 51nod1967 路径定向(欧拉回路+结论题)
看到入度等于出度想到欧拉回路. 我们把边都变成无向边,有一个结论是偶数度的点都可以变成出入度相等的点,而奇数点的不行,感性理解分类讨论一下就知道是对的. 还有一个更好理解的结论是变成无向边后奇数点的个 ...
- [51nod 1681]公共祖先(dfs序+线段树合并)
[51nod 1681]公共祖先(dfs序+线段树合并) 题面 给出两棵n(n<=100000)个点的树,对于所有点对求它们在两棵树中公共的公共祖先数量之和. 如图,对于点对(2,4),它们在第 ...
- UVa 12118 检查员的难题(dfs+欧拉回路)
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- HDU 5348 MZL's endless loop 给边定向(欧拉回路,最大流)
题意: 给一个所有你可能想得到的奇葩无向图,要求给每条边定向,使得每个点的入度与出度之差不超过1.输出1表示定向往右,输出0表示定向往左. 思路: 网络流也是可以解决的!!应该挺简单理解的.但是由于复 ...
- 51nod 1443 路径和树(最短路树)
题目链接:路径和树 题意:给定无向带权连通图,求从u开始边权和最小的最短路树,输出最小边权和. 题解:构造出最短路树,把存留下来的边权全部加起来.(跑dijkstra的时候松弛加上$ < $变成 ...
随机推荐
- iOS仿今日头条滑动导航
之前写了篇博客网易首页导航封装类.网易首页导航封装类优化,今天在前两个的基础上仿下今日头条. 1.网易首页导航封装类中主要解决了上面导航的ScrollView和下面的页面的ScrollView联动的问 ...
- [转]Web Api系列教程第2季(OData篇)(二)——使用Web Api创建只读的OData服务
本文转自:http://www.cnblogs.com/fzrain/p/3923727.html 前言 很久没更新了,之前有很多事情,所以拖了很久,非常抱歉.好了,废话不多说,下面开始正题.本篇仍然 ...
- 禁止选中页面内容-兼容ie、firefox、chrome
使用js禁止用户选中网页上的内容,IE及Chrome下的方法一样.使用onselectstart, 比如: 在body中加入<body onselectstart="return fa ...
- Java - 谨慎实现Comparable接口
类实现了Comparable接口就表明类的实例本身具有内在的排序关系(natural ordering). 因此,该类可以与很多泛型算法和集合实现进行协作. 而我们之需要实现Comparable接口唯 ...
- 微信小程序(一)--简单的介绍
转自:https://developers.weixin.qq.com/miniprogram/dev/index.html 响应的数据绑定 框架的核心是一个响应的数据绑定系统. 整个小程序框架系统分 ...
- Hadoop学习笔记(8) ——实战 做个倒排索引
Hadoop学习笔记(8) ——实战 做个倒排索引 倒排索引是文档检索系统中最常用数据结构.根据单词反过来查在文档中出现的频率,而不是根据文档来,所以称倒排索引(Inverted Index).结构如 ...
- 面试遇到的mysql面试题
1.MySQL数据库有哪些内置函数?1.数学函数 2.字符串函数 3.日期和时间函数 4.条件判断函数5.系统信息函数 6.加密和压缩函数 7.聚合函数8.格式或类型转化函数. 2.如何返回一张表的数 ...
- springmvc 框架原理
先来个原理图,镇博. (图片出处:http://www.cnblogs.com/selene/p/4658554.html,感谢博主的图) 着重看:处理器映射器,处理器适配器,这两个的配置. 这两个的 ...
- vim 配置文件.vimrc,高亮+自动缩进+行号+折叠+优化
将一下代码copy到 用户目录下 新建文件为 .vimrc保存即可生效: 如果想所有用户生效 请修改 /etc/vimrc (建议先cp一份)"====================== ...
- Inter网关做Team的方法
1.到Inter官网上找到相关驱动程序 2.在安装过程中,要求勾选高级网络 3.驱动安装完成后,打开网卡的属性窗口,在“分组”选项卡中,勾中,并输入Team名称 4.选择需要做Team的网卡 5.选择 ...