51nod 1967 路径定向(不错的欧拉回路)
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1967
题意:

思路:
出度=入度,这很容易想到欧拉回路,事实上,这道题目也确实是用欧拉回路来做的,之前一直觉得应该用网络流来做,可惜想不出,后来看官方题解说也是可以的,但是复杂度太高。
对于每条边,先假设它为无向边,奇点的个数肯定是偶数个,对于这些奇点,我们可以两两连条边,使它们变成偶点,这样一来就肯定存在欧拉回路了,跑一遍就可以了。新加的边是不会影响结果的。
这道题目有点卡时间,用printf输出会超时,得用putchar。
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<sstream>
#include<vector>
#include<stack>
#include<queue>
#include<cmath>
#include<map>
#include<set>
using namespace std;
typedef long long ll;
typedef pair<int,ll> pll;
const int inf = 0x3f3f3f3f;
const int maxn=1e6+;
const int mod=1e9+; int n, m;
int vis[maxn];
int ans[maxn];
int flag[maxn];
int degree[maxn]; struct node
{
int u,v;
}e[maxn]; vector<int> G[maxn],p; void dfs(int x)
{
vis[x]=;
for(int i=;i<G[x].size();i++)
{
int idx=G[x][i];
if(flag[idx]) continue;
if(e[idx].u==x) {flag[idx]=;dfs(e[idx].v);}
else {flag[idx]=;dfs(e[idx].u);}
}
} int main()
{
//freopen("in.txt","r",stdin);
scanf("%d%d",&n,&m);
for(int i=;i<m;i++)
{
int u,v;
scanf("%d%d",&u,&v);
e[i].u=u, e[i].v=v;
G[u].push_back(i);
G[v].push_back(i);
degree[u]++;
degree[v]++;
}
for(int i=;i<=n;i++) if(degree[i]&) p.push_back(i);
for(int i=;i<p.size();i+=)
{
e[i/+m].u=p[i], e[i/+m].v=p[i+];
G[p[i]].push_back(i/+m);
G[p[i+]].push_back(i/+m);
}
for(int i=;i<=n;i++)
{
if(!vis[i]) dfs(i);
}
printf("%d\n",n-p.size());
for(int i=;i<m;i++)
{
if(flag[i]==) putchar('');
else putchar('');
}
printf("\n");
return ;
}
51nod 1967 路径定向(不错的欧拉回路)的更多相关文章
- 51nod 1967路径定向(dfs、欧拉回路)
1967 路径定向 基准时间限制:1.2 秒 空间限制:262144 KB 分值: 80 难度:5级算法题 给出一个有向图,要求给每条边重定向,使得定向后出度等于入度的点最多,输出答案和任意一种方案 ...
- 51Nod 1967 路径定向 —— 欧拉回路
题目:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1967 显然是欧拉回路问题,度数为奇数的点之间连边,跑欧拉回路就可以 ...
- 51nod 1967 路径定向——欧拉回路
题目:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1967 一共只会有偶数个奇数度的点.因为每多一条边,总度数加2. 把 ...
- 51nod 1967路径定向(欧拉回路)
题目大意:给出一个图,安排边的方向,使得入度等于出度的点数最多,并给出方案. 首先假设是个无向图,不妨认定偶点必定可以满足条件 我们还会发现,奇点的个数必定是偶数个 那么如果把奇点两两用辅助边连起来, ...
- 51nod1967 路径定向(欧拉回路+结论题)
看到入度等于出度想到欧拉回路. 我们把边都变成无向边,有一个结论是偶数度的点都可以变成出入度相等的点,而奇数点的不行,感性理解分类讨论一下就知道是对的. 还有一个更好理解的结论是变成无向边后奇数点的个 ...
- 51nod1967 路径定向 Fleury
题目传送门 题解 几乎是Fleury模板题. 一开始我们把图看作无向图,然后对于度为奇数的点增边,使得整个图的所有点都是偶数的. 然后跑一遍欧拉回路 Fleury ,所有的边就定向好了~ 代码 #in ...
- 51nod 1443 路径和树(最短路)
题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1443 1443 路径和树 题目来源: CodeForces ...
- 转:requirejs:让人迷惑的路径解析(~~不错)
接触过requirejs的童鞋可能都知道,无论是通过define来定义模块,还是通过require来加载模块,模块依赖声明都是很重要的一步.而其中涉及到的模块路径解析,对于新手来说,有的时候会让人觉得 ...
- 51nod 1443 路径和树(最短路树)
题目链接:路径和树 题意:给定无向带权连通图,求从u开始边权和最小的最短路树,输出最小边权和. 题解:构造出最短路树,把存留下来的边权全部加起来.(跑dijkstra的时候松弛加上$ < $变成 ...
随机推荐
- python爬虫CSDN文章抓取
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/nealgavin/article/details/27230679 CSDN原则上不让非人浏览訪问. ...
- 字符串最长子串匹配-dp矩阵[转载]
转自:https://blog.csdn.net/zls986992484/article/details/69863710 题目描述:求最长公共子串,sea和eat.它们的最长公共子串为ea,长度为 ...
- sklearn_Logistic Regression
一.什么是逻辑回归? 一种名为“回归”的线性分类器,其本质是由线性回归变化而来的,一种广泛使用于分类问题中的广义回归算法 面试高危问题:Sigmoid函数的公式和性质 Sigmoid函数是一个S型的函 ...
- 接口测试xml格式转换成json
未经允许,禁止转载!!!! 接口测试一般返回的是xml和json,现在大多数时候是返回成json的格式,但是有时候也会出现xml格式, 由于xml格式的文件阅读起来不是很容易懂,所以尽量将xml转换成 ...
- 软件包管理:rpm命令管理-安装升级与卸载
严格区分大小写 卸载命令不许再包的目录下执行.
- http协议基础(四)http状态码
一:http状态码 表示客户端http请求的返回结果.标记服务器端的处理是否正常.通知出现的错误等工作 状态码的类别如下: http状态码种类繁多,大概有60多种,实际上经常使用的只有14种,下面为一 ...
- python练习-生成一个1到50的大字符串每个数字之间有个空格
#-*-encoding:UTF-8-*- string=[] for i in range(1,51): string.append(str(i)) print string#打印一下string ...
- redis安装及注意事项
在linux中使用wget时,若报-bash: wget: command not found,则表明没有安装wget,需要安装,安装命令如下: yum -y install wget 安装完成即可以 ...
- Linux基础命令---bc
bc bc是一种算数语言,其语法和c语言类似,可以交互执行.通过命令行选项可以获得一个标准的数学库.如果请求,在处理任何文件之前定义数学库.BC从处理所有文件的代码开始.命令行中列出的文件按所列顺序排 ...
- Linux中Postfix反病毒和垃圾邮件工具(十)
amavisd-new amavisd-new呼叫器是一个连接MTA和内容检测工具(诸如病毒扫描工具和SpamAssassin)的高性能接口程序,使用perl语言写成.它一般通过SMTP.ESMTP或 ...