Codeforces 723e [图论][欧拉回路]
/*
不要低头,不要放弃,不要气馁,不要慌张。
题意:
给你一个有n个点,m条边的无向图,给每条边规定一个方向,使得这个图变成有向图,并且使得尽可能多的点入度与出度相同。
输出有多少个这样的点并且输出有向图。
思路:
1.针对每个连通分支。
2.所有点入度与出度相同,显然这是欧拉回路存在的判定定理,但是欧拉回路的另外一个等价定理是所有点的度数是偶数。那如果给我们的图中的某些点是奇数度该怎么办。
3.显然原图中给的点如果度数是奇数,那么该点的入度与出度一定不相同。
4.根据握手定理,无向图中度数是奇数的点一定是偶数个,所以我们可以尝试对任一连通分支增加一个点,该点与所有该联通分支中奇数点连接一条边,显然该图可以找到一条欧拉回路。
5.将图构建好之后,寻找一条欧拉回路....问题解决... 坑:
wa在图的构建上,没有想到可以加一个点...还是很弱... */
#include<bits/stdc++.h>
#define N 1000
#define M 100000
using namespace std;
int id[N];
int findme(int a){
if(id[a]!=a)return id[a]=findme(id[a]);
return a;
}
bool vis[N][N];
bool vvis[N];
bool vvv[N][N];
bool iii[N];
struct edge{
bool rel,im,vis;
int id;
edge *next;
};
edge edges[M<<];
edge *adj[N];
int num[N];
int ednum;
inline void addedge(int a,int b,bool c){
edge *tmp=&edges[ednum++];
tmp->im=c;
tmp->rel=;
tmp->vis=;
tmp->id=b;
tmp->next=adj[a];
adj[a]=tmp;
}
vector<int>mv;
void dfs(int pos){
vvis[pos]=;
for(edge *it=adj[pos];it;it=it->next){
if(vis[pos][it->id]==&&it->vis==){
vis[pos][it->id]=;
vis[it->id][pos]=;
it->vis=;
dfs(it->id);
}
}
}
int main()
{
int t;
scanf("%d",&t);
while(t--){
memset(iii,,sizeof(iii));
memset(vvv,,sizeof(vvv));
memset(vvis,,sizeof(vvis));
memset(vis,,sizeof(vis));
memset(num,,sizeof(num));
memset(adj,,sizeof(adj));
ednum=;
int n,m;
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)id[i]=i;
for(int i=;i<=m;i++){
int a,b;
scanf("%d%d",&a,&b);
int aa=findme(a);
int bb=findme(b);
if(aa!=bb)id[aa]=bb;
addedge(a,b,);
addedge(b,a,);
num[a]++;
num[b]++;
vvv[a][b]=vvv[b][a]=;
}
mv.clear();
for(int i=;i<=n;i++){
if(num[i]&)mv.push_back(i);
}
int w=mv.size();
for(int i=;i<w;i++){
addedge(mv[i],n+findme(mv[i]),);
addedge(n+findme(mv[i]),mv[i],);
}
for(int i=;i<=n;i++){
if(!vvis[i])dfs(i);
}
printf("%d\n",n-mv.size());
for(int i=;i<=n;i++){
for(edge *it=adj[i];it;it=it->next){
if(it->im&&it->vis){
printf("%d %d\n",i,it->id);
}
}
}
}
}
Codeforces 723e [图论][欧拉回路]的更多相关文章
- codeforces 723E (欧拉回路)
Problem One-Way Reform 题目大意 给一张n个点,m条边的无向图,要求给每条边定一个方向,使得最多的点入度等于出度,要求输出方案. 解题分析 最多点的数量就是入度为偶数的点. 将入 ...
- codeforces 723E:One-Way Reform
Description There are n cities and m two-way roads in Berland, each road connects two cities. It is ...
- 【题解】Points, Lines and Ready-made Titles Codeforces 871C 图论
Prelude 真是一道好题,然而比赛的时候花了太多时间在B题上,没时间想这个了QAQ. 题目链接:萌萌哒传送门(.^▽^) Solution 观察样例和样例解释,我们发现,假如有四个点,恰好占据在某 ...
- CodeForces 723E One-Way Reform
构造. 有一种十分巧妙的方法可以使图中所有度数为偶数的节点,经过每条边定向后,出度和入度都相等. 首先统计每个节点的度数,将度数为奇数的节点与编号为$n+1$的节点连边,这样一来,这张新图变成了每个节 ...
- 【codeforces 723E】One-Way Reform
[题目链接]:http://codeforces.com/contest/723/problem/E [题意] 给你一个无向图; 让你把这m条边改成有向图; 然后使得出度数目等于入度数目的点的数目最多 ...
- Sasha and Interesting Fact from Graph Theory CodeForces - 1109D (图论,计数,Caylay定理)
大意: 求a->b最短路长度为m的n节点树的个数, 边权全部不超过m 枚举$a$与$b$之间的边数, 再由拓展$Caylay$定理分配其余结点 拓展$Caylay$定理 $n$个有标号节点生成k ...
- Ant Man CodeForces - 704B (图论,贪心)
大意: 给N个点,起点S终点T,每个点有X,A,B,C,D,根据I和J的X坐标可得I到J的距离计算公式 |xi - xj| + ci + bj seconds if j< i |xi - xj| ...
- Connecting Vertices CodeForces - 888F (图论,计数)
链接 大意: 给定邻接表表示两点是否可以连接, 要求将图连成树, 且边不相交的方案数 n范围比较小, 可以直接区间dp $f[l][r]$表示答案, $g[l][r]$表示区间[l,r]全部连通且l, ...
- Sergey's problem CodeForces - 1019C (图论,构造,神题)
链接 大意: 给定有向图, 求选择一个点集$S$, 使得$S$任意两点不相连, 且对于不属于$S$的任意点$x$, 均存在$S$中的点$y$, 使得$d(x,y)<=2$, $d(x,y)$为从 ...
随机推荐
- MSSQL CharIndex()用法
CHARINDEX函数返回字符或者字符串在另一个字符串中的起始位置. CHARINDEX ( expression1 , expression2 [ , start_location ] ) expr ...
- Sae上传war包找不到编译文件
最近在试新浪的sae平台,有个问题困扰了几天,现在想来还是自己对JAVA的理解不深入,这里写下仅作记忆. 问题:在整微信公众号平台进开发者中心的时候,token验证一直是失败的.但是项目在本地的环境中 ...
- boundingRectWithSize
CGSize labsize1=[label1.text boundingRectWithSize:CGSizeMake(SCREEN_WIDTH-80, MAXFLOAT) options:NSSt ...
- RedHad中yum安装与使用
yum的安装对于linux来说,是一个福音,至少安装软件来说,非常非常方便,以前使用rpm安装,那个各种依赖,哎,说多了都是泪,现在有这个yum就方便多了. 此处记录redhad的安装.其实我也是借鉴 ...
- C语言之共用体
最近在复习C语言,特再次记录: 有时需要将几种不同类型的变量存放到同一段内存单元中.如一个int.float.char放在同一个地址开始的内存单元中.,也就是使用覆盖技术,几个变量相互覆盖,称之为共用 ...
- C# 代码示例_结构/数组/枚举...
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- iOS- UITextField限制输入长度
限制输入长度的问题,在这里完美的解决了! //先创建一个textField 和 一个button. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ...
- 第三个Sprint冲刺第六天
讨论地点:宿舍 讨论成员:邵家文.李新.朱浩龙.陈俊金 讨论问题:研究一下有趣的东西
- Python::OS 模块 -- 进程参数
os模块的简介请参看 Python::OS 模块 -- 简介 os模块的文件和目录操作 Python::OS 模块 -- 文件和目录操作 os模块的进程管理 Python::OS 模块 -- 进程管理 ...
- notifyDataSetInvalidated()跟notifyDataSetChanged()的区别
public void notifyDataSetChanged(): 通过一个外部的方法控制,如果适配器的内容改变了,那么就会强制调用getView来刷新每个Item的内容.这个方法内部实现了在每个 ...