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)$为从 ...
随机推荐
- java内存泄露的理解与解决(转)
Java内存管理机制 在C++语言中,如果需要动态分配一块内存,程序员需要负责这块内存的整个生命周期.从申请分配.到使用.再到最后的释放.这样的过程非常灵活,但是却十分繁琐,程序员很容易由于疏忽而忘记 ...
- 通过top命令发现plymouthd进程cpu负载达到近100% 解决办法
最近几天一直遇到服务器cpu100%, 通过top命令发现plymouthd进程cpu负载达到近100% 解决方法:打开 /boot/grub/menu.lst , 去掉 “rhgb quiet”这两 ...
- [CDN]CDN的系统架构
---恢复内容开始--- 1.功能架构: CDN技术自1998年诞生以来,伴随着互联网的高速发展,其技术一直在持续演进和完善,但基本的CDN功能架构在2003年左右就已基本形成和稳定下来.从功能上划分 ...
- Mobiscroll 3.0 官方同步版
Mobiscroll 3.0 官方同步版发布了. Mobiscroll是一个用于触摸设备的日期和时间选择器,它的使用不会改变HTML5.PhoneGap以及混合应用的原生用户体验.作为一款jQuery ...
- <s:textfield>标签
中的value=“”还是挺有用的,比如说更新之前,根据需要更新的用户(地址.商品等等等等)的id,在updateInput方法中,先做一些准备,根据这个id去数据库取属性出来,放到ActionCont ...
- Android四大组件之Activity(活动)及其布局的创建与加载布局
Android四大组件之Activity(活动)及其布局的创建与加载布局 什么是Activity ? 活动(Activity)是包含用户界面的组件,主要用于和用户进行交互的,一个应用程序中可以包含零个 ...
- JavaScript基础--面向对象三大特性(八):继承封装多态
一.构造函数基本用法:function 类名(参数列表){ 属性=参数值} function Person(name,age){ this.name = name; this.age = age; } ...
- Cordova android框架详解
一.Cordova 核心java类说明 CordovaActivity:Cordova Activity入口,已实现PluginManager.WebView的相关初始化工作, 只需继承Cordova ...
- SSH basics
SSH, Secure SHell, was designed and created to provide the best security when accessing another comp ...
- HDU 5234 DP背包
题意:给一个n*m的矩阵,每个点是一个蛋糕的的重量,然后小明只能向右,向下走,求在不超过K千克的情况下,小明最终能吃得最大重量的蛋糕. 思路:类似背包DP: 状态转移方程:dp[i][j][k]--- ...