/*
不要低头,不要放弃,不要气馁,不要慌张。
题意:
给你一个有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 [图论][欧拉回路]的更多相关文章

  1. codeforces 723E (欧拉回路)

    Problem One-Way Reform 题目大意 给一张n个点,m条边的无向图,要求给每条边定一个方向,使得最多的点入度等于出度,要求输出方案. 解题分析 最多点的数量就是入度为偶数的点. 将入 ...

  2. codeforces 723E:One-Way Reform

    Description There are n cities and m two-way roads in Berland, each road connects two cities. It is ...

  3. 【题解】Points, Lines and Ready-made Titles Codeforces 871C 图论

    Prelude 真是一道好题,然而比赛的时候花了太多时间在B题上,没时间想这个了QAQ. 题目链接:萌萌哒传送门(.^▽^) Solution 观察样例和样例解释,我们发现,假如有四个点,恰好占据在某 ...

  4. CodeForces 723E One-Way Reform

    构造. 有一种十分巧妙的方法可以使图中所有度数为偶数的节点,经过每条边定向后,出度和入度都相等. 首先统计每个节点的度数,将度数为奇数的节点与编号为$n+1$的节点连边,这样一来,这张新图变成了每个节 ...

  5. 【codeforces 723E】One-Way Reform

    [题目链接]:http://codeforces.com/contest/723/problem/E [题意] 给你一个无向图; 让你把这m条边改成有向图; 然后使得出度数目等于入度数目的点的数目最多 ...

  6. Sasha and Interesting Fact from Graph Theory CodeForces - 1109D (图论,计数,Caylay定理)

    大意: 求a->b最短路长度为m的n节点树的个数, 边权全部不超过m 枚举$a$与$b$之间的边数, 再由拓展$Caylay$定理分配其余结点 拓展$Caylay$定理 $n$个有标号节点生成k ...

  7. 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| ...

  8. Connecting Vertices CodeForces - 888F (图论,计数)

    链接 大意: 给定邻接表表示两点是否可以连接, 要求将图连成树, 且边不相交的方案数 n范围比较小, 可以直接区间dp $f[l][r]$表示答案, $g[l][r]$表示区间[l,r]全部连通且l, ...

  9. Sergey's problem CodeForces - 1019C (图论,构造,神题)

    链接 大意: 给定有向图, 求选择一个点集$S$, 使得$S$任意两点不相连, 且对于不属于$S$的任意点$x$, 均存在$S$中的点$y$, 使得$d(x,y)<=2$, $d(x,y)$为从 ...

随机推荐

  1. iOS开发UI篇—iPad开发中得modal介绍

    iOS开发UI篇—iPad开发中得modal介绍 一.简单介绍 说明1: 在iPhone开发中,Modal是一种常见的切换控制器的方式 默认是从屏幕底部往上弹出,直到完全盖住后面的内容为止 说明2: ...

  2. 使用实时文件夹显示ContentProvider的数据

    所谓实时文件夹(即LiveFolder),是指用于显示ContentProvider提供的数据的桌面组件. ContentProvider用于向外提供数据访问的接口,一个应用程序可通过ContentP ...

  3. 单例模式(Singleton Pattern)

    动机: 在软件系统中,经常有这样一些特殊的类,必须保证它们在系统中只存在一个实例,才能确保它们的逻辑正确性.以及良好的效率. 如何绕过常规的构造器,提供一种机制来保证一个类只有一个实例? 这应该是类设 ...

  4. 如何利用Cloudera Manager来手动安装parcel包

    1.问题的描述: 当你利用Cloudera Manager部署了CDH的集群后,也许随着你的业务需求,你需要对你的就去哪做一些优化,或者扩展之类的,这个时候你可能需要下载安装一些组件.例如,我最近在阅 ...

  5. css2----清除浮动

    为什么要清除浮动? 非IE下,当容器的高度为auto,容器有浮动元素,此时容器的高度不能自己伸长适应内容的高度,造成内容溢出乃至影响布局,即所谓的“浮动溢出”,为防此象,需要清除浮动. 如何清除浮动? ...

  6. 在VS下使用 GitFlow管理项目开发

    在VS下使用 GitFlow管理项目开发 1.右键将你的解决方案添加到源代码管理,如果你的VS没有安装git,会提示安装,安装完成之后,在团队资源管理可以看到如下界面 (图一) 2.安装gitflow ...

  7. SAP 增强-出口选找方法-全部

    ■ SAP 中如何寻找增强 方法一:利用TCODE寻找增强(第二代的增强) 执行一个程序(源代码后附),在选择屏幕处输入你所需要增强的程序TCODE,执行後,就会出现一个列表,那里就有关于如何增强这个 ...

  8. 关于KNN的python3实现

    关于KNN,有幸看到这篇文章,写的很好,这里就不在赘述.直接贴上代码了,有小的改动.(原来是python2版本的,这里改为python3的,主要就是print) 环境:win7 32bit + spy ...

  9. C# 计算时间差 用timespan函数

    TimeSpan 结构  表示一个时间间隔. 命名空间:System 程序集:mscorlib(在 mscorlib.dll 中) 1.DateTime值类型代表了一个从公元0001年1月1日0点0分 ...

  10. thrift编译安装

    关于thrift的介绍:http://www.ibm.com/developerworks/cn/java/j-lo-apachethrift/ Apache Thrift 是 Facebook 实现 ...