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)$为从 ...
随机推荐
- 1238. Folding
http://acm.timus.ru/problem.aspx?space=1&num=1238 DP+记忆化搜索 思路不难,关键是最优结果的储存问题,为了编写方便,直接用string储存最 ...
- C# 跨线程操作无效
提示此错误的原因就是控件由主线程创建,在另一个线程进行操作时就会被阻止,防止数据间随意篡改. 如果一定要跨线程作业,如进度条或状态显示等,基本有三种方法解决: 1.Control.CheckForIl ...
- GCC编译器编译链接
在gcc编译器环境下,常见的文件扩展名的含义如下: .c:C源程序,经过预编译后的源程序也为.c文件,它可以通过-E参数输出. .h:头文件 .s:经过编译得到的汇编程序代码,它可以通过-S参数输出. ...
- Sharepoint的javascript客户端对象模型获取其他站点的list
获取当前站点(子站点而不是站点集)下的list var clientContext = new SP.ClientContext.get_current(); var list=clientConte ...
- 绑定hosts
测试过程中需绑定hosts.将测试环境IP绑定域名,输入域名即可连接到测试环境. 1 hosts文件地址:C:\WINDOWS\system32\drivers\etc 2 用记事本打开hosts ...
- 拔靴法--Bootstrap--R语言实现
拔靴法属于重复抽样(resampling)方法,与Monte Carlo相比,二者真实的母体不同.它是将已有的观察值作为母体重复抽样, 以求取原先资料不足二无法探讨的资料特性. 举个例子,假设x1,x ...
- PHP面向对象(分页)
<?php class page { var $table; var $pagesize; var $totalsize; var $totalp ...
- php wampserver 80 端口无法开启的解决方法
下载Microsoft Visual C++ 2005 Redistributable Package x86 和 x64(vc_redist.x86.exe/vc_redist.x64.exe) 安 ...
- linux之虚拟机搭建
平台:win8.1 软件:VMware 虚拟机:centos7mini 1.下载ios镜像 http://centos.org/download/ 2.在VMware上面安装ios镜像 3.设置网卡连 ...
- UIApplication的使用
//// UIApplication的使用// IOS笔记//// Created by **** on ****.// Copyright © 2013年 ***. All rights re ...