【题解】51nod1967 路径定向

  第一次写欧拉回路,实际上只要dfs下去就可以了,反正每条边都是要遍历一遍的……

  关键有两个性质:1.一个无向图存在欧拉回路,当且仅当该图所有顶点度数都为偶数,且该图是连通图。2.一个有向图存在欧拉回路,所有顶点的入度等于出度且该图是连通图。

  所以我们可以将所有的奇点之间两两连边使得它们成为偶点。此时这张图上必然存在欧拉路径,也就是所有顶点的入度等于出度,我们只需要减去奇点即可。

#include <bits/stdc++.h>
using namespace std;
#define maxn 1000000
int n, m, tot, cnt;
int e[maxn], rec[maxn], degree[maxn];

int read()
{
    int x = 0, k = 1;
    char c;
    c = getchar();
    while(c < ‘0‘ || c > ‘9‘) { if(c == ‘-‘) k = -1; c = getchar(); }
    while(c >= ‘0‘ && c <= ‘9‘) x = x * 10 + c - ‘0‘, c = getchar();
    return x * k;
}

struct edge
{
    int cnp, to[maxn], last[maxn], head[maxn], id[maxn], mark[maxn];
    edge() { cnp = 2; }
    void add(int u, int v)
    {
        to[cnp] = v, id[cnp] = 1, last[cnp] = head[u], head[u] = cnp ++;
        to[cnp] = u, id[cnp] = 0, last[cnp] = head[v], head[v] = cnp ++;
    }
}E1; 

void dfs(int u)
{
    for(int i = E1.head[u]; i; i = E1.last[i])
    {
        if(E1.mark[i]) continue;
        int v = E1.to[i];
        if(E1.id[i]) E1.mark[i] = E1.mark[i ^ 1] = 1;
        else E1.mark[i] = E1.mark[i ^ 1] = 2;
        dfs(v);
    }
}

int main()
{
    n = read(), m = read();
    for(int i = 1; i <= m; i ++)
    {
        int x = read(), y = read();
        degree[x] ++, degree[y] ++; E1.add(x, y);
    }
    for(int i = 1; i <= n; i ++)
        if(degree[i] & 1) e[++ cnt] = i;
    int M = E1.cnp;
    for(int i = 1; i <= cnt; i += 2)
    {
        int x = e[i], y = e[i + 1];
        E1.add(x, y);
    }
    for(int i = 1; i <= n; i ++) dfs(i);
    printf("%d\n", n - cnt);
    for(int i = 2; i < M; i += 2)
        if(E1.mark[i] == 1) putchar(‘0‘);
        else putchar(‘1‘);
    return 0;
}

原文地址:https://www.cnblogs.com/twilight-sx/p/9649014.html

时间: 2024-11-05 22:41:21

【题解】51nod1967 路径定向的相关文章

Codevs1021题解---SPFA+路径记录

题目描述 Description 麦克找了个新女朋友,玛丽卡对他非常恼火并伺机报复. 因为她和他们不住在同一个城市,因此她开始准备她的长途旅行. 在这个国家中每两个城市之间最多只有一条路相通,并且我们知道从一个城市到另一个城市路上所需花费的时间. 麦克在车中无意中听到有一条路正在维修,并且那儿正堵车,但没听清楚到底是哪一条路.无论哪一条路正在维修,从玛丽卡所在的城市都能到达麦克所在的城市. 玛丽卡将只从不堵车的路上通过,并且她将按最短路线行车.麦克希望知道在最糟糕的情况下玛丽卡到达他所在的城市需

51nod 1967 路径定向(不错的欧拉回路)

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1967 题意: 思路: 出度=入度,这很容易想到欧拉回路,事实上,这道题目也确实是用欧拉回路来做的,之前一直觉得应该用网络流来做,可惜想不出,后来看官方题解说也是可以的,但是复杂度太高. 对于每条边,先假设它为无向边,奇点的个数肯定是偶数个,对于这些奇点,我们可以两两连条边,使它们变成偶点,这样一来就肯定存在欧拉回路了,跑一遍就可以了.新加的边是不会影响结果的. 这道题目

BZOJ3697 采药人的路径 【点分治】

题目 采药人的药田是一个树状结构,每条路径上都种植着同种药材. 采药人以自己对药材独到的见解,对每种药材进行了分类.大致分为两类,一种是阴性的,一种是阳性的. 采药人每天都要进行采药活动.他选择的路径是很有讲究的,他认为阴阳平衡是很重要的,所以他走的一定是两种药材数目相等的路径.采药工作是很辛苦的,所以他希望他选出的路径中有一个可以作为休息站的节点(不包括起点和终点),满足起点到休息站和休息站到终点的路径也是阴阳平衡的.他想知道他一共可以选择多少种不同的路径. 输入格式 第1行包含一个整数N.

某模拟赛C题 树上路径统计 (点分治)

题意 给定一棵有n个节点的无根树,树上的每个点有一个非负整数点权.定义一条路径的价值为路径上的点权和-路径上的点权最大值. 给定参数P,我!=们想知道,有多少不同的树上简单路径,满足它的价值恰好是P的倍数. 注意:单点算作一条路径:u!=v时,(u,v)和(v,u)只算一次. 题解 树上路径统计,解法是点分治.点分的时候求出根到每个点路径最大值和权值和.排一序,然后开个桶,就能计算了.去重就套路的减去没棵子树里面的答案. CODE #include <bits/stdc++.h> using

Python 小问题解决

安装第三方源包时候,我使用的是pip,但是遇到很多问题.使用的Python 3.5,安装了VS2012 因为参考的是廖雪峰的教程,首先是PIL的安装上一直出问题. 直接使用 pip install PIL 直接是no matching distribution found  for PIL 查了一下,原来PIL早不更新了,现在用的是pillow 之后使用命令  pip install pillow,结果 网速不行,外国的源国内链接还是比较麻烦.就使用了豆瓣的镜像源http://pypi.doub

【BZOJ 4326】NOIP2015运输计划

http://www.lydsy.com/JudgeOnline/problem.php?id=4326 题目描述 公元2044年,人类进入了宇宙纪元. 国有个星球,还有条双向航道,每条航道建立在两个星球之间,这条航道连通了国的所有星球. 小掌管一家物流公司,该公司有很多个运输计划,每个运输计划形如:有一艘物流飞船需要从号星球沿最快的宇航路径飞行到号星球去.显然,飞船驶过一条航道是需要时间的,对于航道,任意飞船驶过它所花费的时间为,并且任意两艘飞船之间不会产生任何干扰. 为了鼓励科技创新,国国王

structs2源码分析

一.到网上下载struts2的源代码: http://mirrors.cnnic.cn/apache//struts/source/struts-2.3.16.3-src.zip 我把项目的源码路径定向到下载到的源代码: 这份是webwork的核心源码,读取配置文件的核心代码就在于此: 二.下面是struts本尊,基本实现的就是请求的分发: 二.从项目本身去做分析: 好多大牛大师傅都不断强调,去看源码分析源码,但是却从来很少人,告诉你怎么去看,经过多年的摸索我总算找到一个分析源代码的套路,特别对

Node.js【6】Web开发、进阶(模块加载、控制流、部署、弊端)

笔记来自<Node.js开发指南>BYVoid编著 实现过程:https://github.com/ichenxiaodao/express-example 第5章 使用Node.js进行Web开发 从零开始用Node.js实现一个微博系统,功能包括路由控制.页面模板.数据库访问.用户注册.登录.用户会话等内容. 会介绍Express框架.MVC设计模式.ejs模板引擎以及MongoDB数据库的操作. 5.1.准备工作 Express(http://expressjs.com/)除了为http

Delphi Bpl包学习

对于BPL包,我个人理解是:就是一种封装方式,和DLL,EXE类似,把代码放到包(package)里面保存而已. 一.先说说如何创建BPL包 1.   打开delphi IDE(delphi7 为例)-->File-->Close ALL(关闭全部) -->File-->New-->other-->在New Item选项卡中选择(new)-->package-->ok; 2.点击ok后,delphi就帮我们创建好了一些包需要的基础东西,如下图, 这个时候我们