51nod 1967 路径定向——欧拉回路】的更多相关文章

题目:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1967 显然是欧拉回路问题,度数为奇数的点之间连边,跑欧拉回路就可以得到方案: 想一想不会有奇数个奇度数的点,否则总度数就是奇数,但一条边增加两个度,所以总度数一定是偶数: 一定注意奇度数的点之间连边时要 deg++ !还是把这个写在连边函数里比较靠谱... 代码如下: #include<iostream> #include<cstdio> #incl…
题目:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1967 一共只会有偶数个奇数度的点.因为每多一条边,总度数加2. 把奇数度的点之间连一条边,然后走欧拉回路.回溯的时候加边的意思是真正走过的边,应该走的是它的反向边. printf 会超时?!用putchar 快很多! #include<iostream> #include<cstdio> #include<cstring> #includ…
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位…
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1967 题意: 思路: 出度=入度,这很容易想到欧拉回路,事实上,这道题目也确实是用欧拉回路来做的,之前一直觉得应该用网络流来做,可惜想不出,后来看官方题解说也是可以的,但是复杂度太高. 对于每条边,先假设它为无向边,奇点的个数肯定是偶数个,对于这些奇点,我们可以两两连条边,使它们变成偶点,这样一来就肯定存在欧拉回路了,跑一遍就可以了.新加的边是不会影响结果的. 这道题目…
题目大意:给出一个图,安排边的方向,使得入度等于出度的点数最多,并给出方案. 首先假设是个无向图,不妨认定偶点必定可以满足条件 我们还会发现,奇点的个数必定是偶数个 那么如果把奇点两两用辅助边连起来,对全图求一个欧拉回路,就可以得到这个方案 因为奇点肯定不会是答案点,所以奇点连起来不会有影响 这时的欧拉回路就可以保证所有偶点满足入度等于出度 这里为了简便,写的是dfs出欧拉道路,因为欧拉道路同样可以满足要求 #include <iostream> #include <cstring>…
看到入度等于出度想到欧拉回路. 我们把边都变成无向边,有一个结论是偶数度的点都可以变成出入度相等的点,而奇数点的不行,感性理解分类讨论一下就知道是对的. 还有一个更好理解的结论是变成无向边后奇数点的个数一定只有偶数个,因为有一个奇数点就一定有另一个跟他对应. 那么我们把奇数点凑成对连边,这样奇数点也变成了偶数点.无向图中所有的点的度数为偶数就存在欧拉回路,于是我们就可以跑一遍欧拉回路途中判断边是否需要返向来得到方案. 卡常题T T(其实是我写太丑 #include<stdio.h> #incl…
题目传送门 题解 几乎是Fleury模板题. 一开始我们把图看作无向图,然后对于度为奇数的点增边,使得整个图的所有点都是偶数的. 然后跑一遍欧拉回路 Fleury ,所有的边就定向好了~ 代码 #include <cstring> #include <algorithm> #include <cstdio> #include <cstdlib> #include <cmath> using namespace std; ,M=3e5*+; ,di…
题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1443 1443 路径和树 题目来源: CodeForces 基准时间限制:1.5 秒 空间限制:131072 KB 分值: 160 难度:6级算法题   给定一幅无向带权连通图G = (V, E) (这里V是点集,E是边集).从点u开始的最短路径树是这样一幅图G1 = (V, E1),其中E1是E的子集,并且在G1中,u到所有其它点的最短路径与他在G中是一样…
题目链接:路径和树 题意:给定无向带权连通图,求从u开始边权和最小的最短路树,输出最小边权和. 题解:构造出最短路树,把存留下来的边权全部加起来.(跑dijkstra的时候松弛加上$ < $变成$ <= $,因为之后跑到该顶点说明是传递下来的,该情况边权和最小.) 以样例作说明:第一次从顶点3跑到顶点1,最短路为2:第二次从顶点3经过顶点2跑到顶点1,最短路也为2,但是第二次跑的方式可以把从顶点3跑到顶点2的包括进去,这样形成的最短路树边权和最小. #include <queue>…
第一次写欧拉回路,实际上只要dfs下去就可以了,反正每条边都是要遍历一遍的…… 关键有两个性质:1.一个无向图存在欧拉回路,当且仅当该图所有顶点度数都为偶数,且该图是连通图.2.一个有向图存在欧拉回路,所有顶点的入度等于出度且该图是连通图. 所以我们可以将所有的奇点之间两两连边使得它们成为偶点.此时这张图上必然存在欧拉路径,也就是所有顶点的入度等于出度,我们只需要减去奇点即可. #include <bits/stdc++.h> using namespace std; #define maxn…