E:Eulerian Flight Tour

题意:

给你一张无向图,要你给这个图加边使得其形成一个欧拉回路

题解:

首先使得所有节点的度都为偶数,然后将这个图联通起来

对于度为奇数的点,将将他和他的父节点连接起来

连接完后如果这个图是联通的,那么就直接输出结果

如果这个图有多个联通块:

分类讨论:

如果有2个联通块,两个联通块对着连成一个环

如果有多个联通块,用一个环将这几个联通块连起来即可

代码:

# E:Eulerian Flight Tour

## 题意:

给你一张无向图,要你给这个图加边使得其形成一个欧拉回路

## 题解:

首先使得所有节点的度都为偶数,然后将这个图联通起来

对于度为奇数的点,将将他和他的父节点连接起来

连接完后如果这个图是联通的,那么就直接输出结果

如果这个图有多个联通块:

分类讨论:

如果有2个联通块,两个联通块对着连成一个环

如果有多个联通块,用一个环将这几个联通块连起来即可

代码:

```c++
#include<bits/stdc++.h>
using namespace std;
typedef pair<int, int> pii;
#define FIN freopen("input.txt","r",stdin);
const int maxn = 4e3 + ;
int n, m;
int vis[maxn];
int deg[maxn];
bool G[maxn][maxn];
bool flag;
vector<pii> ans;
void dfs(int u, int p) {
vis[u] = ;
for(int v = ; v <=n; v++) {
if(vis[v]) continue;
if(G[u][v]) continue;
dfs(v, u);
}
if(deg[u] & ) {
if(p == -) flag = false;
else {
ans.push_back(make_pair(u, p));
deg[u]++, deg[p]++;
G[u][p] = G[p][u] = ;
}
}
} vector<int> tmp;
vector<vector<int>> A;
void dfs1(int u) {
vis[u] = ;
for(int v = ; v <= n; v++) {
if(v == u) continue;
if(vis[v]) continue;
if(!G[u][v]) continue;
dfs1(v);
}
tmp.push_back(u);
}
int main() {
#ifndef ONLINE_JUDGE
FIN
#endif
cin >> n >> m;
memset(deg,,sizeof(deg));
memset(G,,sizeof(G));
for(int i = , u, v; i < m; i++) {
cin >> u >> v;
// u--,v--;
deg[u]++, deg[v]++;
G[u][v] = G[v][u] = ;
}
// cout<<"hhh"<<endl;
flag = true;
ans.clear();
for(int i = ; i <= n; i++) {
if(vis[i]) continue;
dfs(i, -);
}
if(!flag) {
cout << - << endl;
} else {
memset(vis, , sizeof(vis));
for(int i = ; i <= n; i++) {
if(vis[i]) continue;
tmp.clear();
dfs1(i);
A.push_back(tmp);
}
if (A.size() == ) {
if (A[].size() > A[].size()) swap(A[], A[]);
if (A[].size() == ) {
int t = A[][];
int u = -, v=-;
for (int i = ; i < A[].size(); ++i) {
for(int j = i + ; j < A[].size(); ++j) {
int cu = A[][i], cv = A[][j];
if (!G[cu][cv]) u = cu, v = cv;
}
}
if (u == -) {
if (ans.size() == ) {
cout << - << endl;
return ;
}
u = ans.back().first;
v = ans.back().second;
ans.pop_back();
} else {
ans.push_back(make_pair(u, v));
}
ans.push_back(make_pair(t, u));
ans.push_back(make_pair(t, v));
} else {
for (int it = ; it < ; ++it) {
for (int it2 = ; it2 < ; ++it2) {
ans.push_back(make_pair(A[][it], A[][it2]));
}
}
}
} else if (A.size() > ) {
for (int i = ; i < A.size(); ++i) {
int j = (i + ) % A.size();
ans.push_back(make_pair(A[i][], A[j][]));
}
}
cout << ans.size() << endl;
for (int i = ; i < ans.size(); i++) {
if (ans[i].first > ans[i].second) swap(ans[i].first, ans[i].second);
cout << ans[i].first << " " << ans[i].second << endl;
}
}
return ;
} ```

中南多校对抗赛 第三场 E的更多相关文章

  1. 中南多校对抗赛 第三场 B

    B:Arithmetic Progressions 题意: 给你一个长度为n的序列,问你这个序列中长度最长的等差数列长度为多少 题解: 方法一:将数组从小到大排序,n方扫,枚举出公差d,然后二分找有多 ...

  2. 2019HDU多校训练第三场 Planting Trees 暴力 + 单调队列优化

    题意:有一个n * n的网格,每个网格中间有一颗树,你知道每棵树的高,你可以选择一个矩形区域把里面的树都围起来,但是矩形区域里面任意两棵树的高度差的绝对值不超过m,问这个矩形的最大面积是多少? 思路: ...

  3. HDU 5754 Life Winner Bo (各种博弈) 2016杭电多校联合第三场

    题目:传送门 题意:一个国际象棋棋盘,有四种棋子,从(n,m)走到(1,1),走到(1,1)的人赢,先手赢输出B,后手赢输出G,平局输出D. 题解:先把从(n,m)走到(1,1)看做是从(1,1)走到 ...

  4. HDU 4893 Wow! Such Sequence!(2014年多校联合 第三场 G)(线段树)

    磨了一天的线段树,不能说完全搞清楚,只能说有一个大概的了解,靠着模板才把这道题A了,只能说太弱~~! 题意: 初始时有一字符串,全为0. 三种操作: 1 k d - add  把d加到第k个数上去2 ...

  5. 牛客网多校训练第三场 C - Shuffle Cards(Splay / rope)

    链接: https://www.nowcoder.com/acm/contest/141/C 题意: 给出一个n个元素的序列(1,2,...,n)和m个操作(1≤n,m≤1e5),每个操作给出两个数p ...

  6. HDU 多校对抗第三场 L Visual Cube

    Problem L. Visual Cube Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java ...

  7. 2019牛客暑期多校训练营(第三场)- F Planting Trees

    题目链接:https://ac.nowcoder.com/acm/contest/883/F 题意:给定n×n的矩阵,求最大子矩阵使得子矩阵中最大值和最小值的差值<=M. 思路:先看数据大小,注 ...

  8. HDU 5762 Teacher Bo (鸽笼原理) 2016杭电多校联合第三场

    题目:传送门. 题意:平面上有n个点,问是否存在四个点 (A,B,C,D)(A<B,C<D,A≠CorB≠D)使得AB的横纵坐标差的绝对值的和等于CD的横纵坐标差的绝对值的和,n<1 ...

  9. HDU 5752 Sqrt Bo (思维题) 2016杭电多校联合第三场

    题目:传送门. 题意:一个很大的数n,最多开5次根号,问开几次根号可以得到1,如果5次还不能得到1就输出TAT. 题解:打表题,x1=1,x2=(x1+1)*(x1+1)-1,以此类推.x5是不超过l ...

随机推荐

  1. 第1章 Python基础

    一.安装Python windows: 1.下载安装包     https://www.python.org/downloads/ 2.安装     默认安装路径:C:\python27 3.配置环境 ...

  2. 使用PYTHON解析Wireshark的PCAP文件

    PYTHON首先要安装scapy模块 PY3的安装scapy-python3,使用PIP安装就好了,注意,PY3无法使用pyinstaller打包文件,PY2正常 PY2的安装scapy,比较麻烦 f ...

  3. BZOJ 3489 A simple rmq problem 可持久化KDtree/二维线段树

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3489 题意概述: 给出一个序列,每次询问一个序列区间中仅出现了一次的数字最大是多少,如果 ...

  4. c# printDialog不显示问题

    1.遇到问题:同样的代码,一个可以运行成功,另一个失败.百思不得其解情况下,监视下看每一个参数的属性是否一样,但参数太多,需要时间. 主要问题一般归结为:两个项目的属性编译设置不同,果然,一个x86正 ...

  5. Windows 10 系统下Python环境的搭建与配置

    1. 在https://www.python.org/downloads/release/python-352/网站上下载python版本 2. 配置环境 右击计算机属性,然后选择高级系统设置 3.  ...

  6. FormsAuthentication.SetAuthCookie 方法登录

    FormsAuthentication.SetAuthCookie 方法,登录的原理. FormsAuthentication.SetAuthCookie 方法登录的过期时间. 登录相关阅读 asp. ...

  7. lintcode-389-判断数独是否合法

    389-判断数独是否合法 请判定一个数独是否有效. 该数独可能只填充了部分数字,其中缺少的数字用 . 表示. 注意事项 一个合法的数独(仅部分填充)并不一定是可解的.我们仅需使填充的空格有效即可. 说 ...

  8. UML之Enterprise Architect使用

    版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:UML之Enterprise Architect使用     本文地址:http://tech ...

  9. Jmeter 快速入门--初识线程组

    添加线程组 (1)thread group(线程组),setup thread group相当于lr初始化“环境”的初始化脚本,teardown thread group相当于lr测试完毕后对应的清除 ...

  10. linux自启动、定时启动脚本

    linux开机自启动 想让一个程序.脚本开机自启动,可以在/etc/rc.d目录下面找到rc.local文件,编辑该文件,在尾部加上需要运行的命令即可. 如: #cd /etc/rc.d #sudo ...