1967 路径定向

基准时间限制:1.2 秒 空间限制:262144 KB 分值: 80 难度:5级算法题

给出一个有向图,要求给每条边重定向,使得定向后出度等于入度的点最多,输出答案和任意一种方案

Input
第一行两个正整数N,M,表示1-N号点与M条边
接下来M行,每行两个正整数Xi,Yi,表示存在一条有向边从Xi指向Yi
N≤10^5,   M≤3*10^5,   Xi,Yi≤N
Output
第一行一个整数Ans,表示定向后出度等于入度的最大点数
第二行一个长度为M的01字符串,第i位为0表示第i条边不改向,第i位为1表示第i条边改变方向
Input示例
7 7
1 2
2 3
2 3
4 5
1 5
6 7
6 7
Output示例
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、欧拉回路)的更多相关文章

  1. 51nod 1967路径定向(欧拉回路)

    题目大意:给出一个图,安排边的方向,使得入度等于出度的点数最多,并给出方案. 首先假设是个无向图,不妨认定偶点必定可以满足条件 我们还会发现,奇点的个数必定是偶数个 那么如果把奇点两两用辅助边连起来, ...

  2. 51Nod 1967 路径定向 —— 欧拉回路

    题目:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1967 显然是欧拉回路问题,度数为奇数的点之间连边,跑欧拉回路就可以 ...

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

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1967 题意: 思路: 出度=入度,这很容易想到欧拉回路,事实上,这道题目 ...

  4. 51nod 1967 路径定向——欧拉回路

    题目:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1967 一共只会有偶数个奇数度的点.因为每多一条边,总度数加2. 把 ...

  5. 51nod1967 路径定向(欧拉回路+结论题)

    看到入度等于出度想到欧拉回路. 我们把边都变成无向边,有一个结论是偶数度的点都可以变成出入度相等的点,而奇数点的不行,感性理解分类讨论一下就知道是对的. 还有一个更好理解的结论是变成无向边后奇数点的个 ...

  6. [51nod 1681]公共祖先(dfs序+线段树合并)

    [51nod 1681]公共祖先(dfs序+线段树合并) 题面 给出两棵n(n<=100000)个点的树,对于所有点对求它们在两棵树中公共的公共祖先数量之和. 如图,对于点对(2,4),它们在第 ...

  7. UVa 12118 检查员的难题(dfs+欧拉回路)

    https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  8. HDU 5348 MZL's endless loop 给边定向(欧拉回路,最大流)

    题意: 给一个所有你可能想得到的奇葩无向图,要求给每条边定向,使得每个点的入度与出度之差不超过1.输出1表示定向往右,输出0表示定向往左. 思路: 网络流也是可以解决的!!应该挺简单理解的.但是由于复 ...

  9. 51nod 1443 路径和树(最短路树)

    题目链接:路径和树 题意:给定无向带权连通图,求从u开始边权和最小的最短路树,输出最小边权和. 题解:构造出最短路树,把存留下来的边权全部加起来.(跑dijkstra的时候松弛加上$ < $变成 ...

随机推荐

  1. python36异步任务 获取ip地址的地理位置

    # encoding: utf-8 import asyncio import requests import functools url = "http://ip.zxinc.org/ap ...

  2. webstorm中sass编译时目录或内容包含中文字符报错

    ruby版本:ruby 2.3.1p112 (2016-04-26 revision 54768) [x64-mingw32] sass版本:Sass 3.4.22 (Selective Steve) ...

  3. vmware8~12最新版本 克隆Centos6.X 系列虚拟机网卡无法启动问题 (三步即可)

    1.因工作或者学习需要,都需要在VM上克隆一台服务器,此时无论是快捷克隆(相当于快照的机体)或者完整克隆,都会碰到IP问题. 如:创建后症状:启动之后使用ifconfig,发现无ip地址,只有回环地址 ...

  4. Mybatis初始

    1.Mybatis 的作用 完成基本的sql语句 和 存储过程 高级的对象关系映射(ORM) 框架 封装了几乎所有的 JDBC 代码 参数的手工设置 结果集的遍历 2.Mybatis 框架的主体构成 ...

  5. 新装iis 页面503错误 DefaultAppPool停止解决方案

    配置:应用程序池-选择要配置的应用池-高级设置-标识-选择LocalSystem

  6. 小程序插入html代码

    转自:https://blog.csdn.net/BetterGG/article/details/81027291 一.首先,html 分 2 种情况: 1.我在做详情页开发的时候发现获取到的数据是 ...

  7. Java异步转同步

    参考原文: <http://blog.csdn.net/veson__/article/details/53898890>

  8. jvm工具及命令大全

      虚拟机栈 栈桢大小缺省为1M,可用参数 –Xss调整大小,例如-Xss256k 堆 -Xms:堆的最小值: -Xmx:堆的最大值: -Xmn:新生代的大小: -XX:NewSize:新生代最小值: ...

  9. 使用dom4j写xml文件——源码

    1 dom4j下载与配置 1.1 dom4j下载 请移步下载链接 1.2 maven依赖 <dependency> <groupId>org.dom4j</groupId ...

  10. 手把手教你写一个RPC

    1.1 RPC 是什么 定义:RPC(Remote Procedure Call Protocol)--远程过程调用协议 ,RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数 ...