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的时候松弛加上$ < $变成 ...
随机推荐
- 【TCP协议详解】
为什么会有TCP/IP协议 在世界上各地,各种各样的电脑运行着各自不同的操作系统为大家服务,这些电脑在表达同一种信息的时候所使用的方法是千差万别.就好像圣经中上帝打乱了各地人的口音,让他们无法合作一样 ...
- C# Aspose填充excel模板数据,下载
public Result<object> GetAExcelFieItem(string[] aid, int kind, string contype) { string fileUr ...
- python爬虫实战(八)--------知乎
相关代码已经修改调试成功----2017-4-22 一.说明 1.目标网址:知乎登入后的首页 2.实现:如图字段的爬取 zhihu_question表: zhihu_answer表: 3.数据:存放在 ...
- 跨域 cookies
script标签请求的js脚本,如果跨域了,请求会带有外域的cookies信息. XMLHttpRequest请求跨域时,需要有Access-Control-*等的头信息,如果需要将cookies传输 ...
- Office 卸载问题(安装包的语言不受系统支持)
本人系统Win7 这个问题搞了一下午.各种网站找解决办法.下载下来的都是一些垃圾软件. Win7以上调成兼容模式运行理论可行. 放上微软的解决方法: * 彻底卸载Office 2003: http:/ ...
- C++/CLI 本地字符串和托管字符串之间的转换
参考: https://docs.microsoft.com/zh-cn/cpp/dotnet/overview-of-marshaling-in-cpp #include "msclr/m ...
- Spring 学习(四)--- AOP
问题 : AOP 解决的问题是什么 Spring AOP 的底层实现是什么 Spring AOP 和 AspectJ 的区别是什么 概述 在软件业,AOP为Aspect Oriented Progra ...
- qq iOS环境配置及调用
1.下载官方iOS sdk:地址:相关文档 2. 将iOS SDK中的TencentOpenAPI.framework和TencentOpenApi_IOS_Bundle.bundle文件拷贝到应用开 ...
- 全面了解HTTP和HTTPS
序言 Http和Https属于计算机网络范畴,但作为开发人员,不管是后台开发或是前台开发,都很有必要掌握它们. 在学习Http和Https的过程中,主要是参考了阮一峰老师的博客,讲的很全面,并且通俗易 ...
- java:模拟栈操作
import java.util.ArrayList; public class MyStack { private ArrayList<Object> arrayList; public ...