中南多校对抗赛 第三场 E
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的更多相关文章
- 中南多校对抗赛 第三场 B
B:Arithmetic Progressions 题意: 给你一个长度为n的序列,问你这个序列中长度最长的等差数列长度为多少 题解: 方法一:将数组从小到大排序,n方扫,枚举出公差d,然后二分找有多 ...
- 2019HDU多校训练第三场 Planting Trees 暴力 + 单调队列优化
题意:有一个n * n的网格,每个网格中间有一颗树,你知道每棵树的高,你可以选择一个矩形区域把里面的树都围起来,但是矩形区域里面任意两棵树的高度差的绝对值不超过m,问这个矩形的最大面积是多少? 思路: ...
- HDU 5754 Life Winner Bo (各种博弈) 2016杭电多校联合第三场
题目:传送门 题意:一个国际象棋棋盘,有四种棋子,从(n,m)走到(1,1),走到(1,1)的人赢,先手赢输出B,后手赢输出G,平局输出D. 题解:先把从(n,m)走到(1,1)看做是从(1,1)走到 ...
- HDU 4893 Wow! Such Sequence!(2014年多校联合 第三场 G)(线段树)
磨了一天的线段树,不能说完全搞清楚,只能说有一个大概的了解,靠着模板才把这道题A了,只能说太弱~~! 题意: 初始时有一字符串,全为0. 三种操作: 1 k d - add 把d加到第k个数上去2 ...
- 牛客网多校训练第三场 C - Shuffle Cards(Splay / rope)
链接: https://www.nowcoder.com/acm/contest/141/C 题意: 给出一个n个元素的序列(1,2,...,n)和m个操作(1≤n,m≤1e5),每个操作给出两个数p ...
- HDU 多校对抗第三场 L Visual Cube
Problem L. Visual Cube Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 524288/524288 K (Java ...
- 2019牛客暑期多校训练营(第三场)- F Planting Trees
题目链接:https://ac.nowcoder.com/acm/contest/883/F 题意:给定n×n的矩阵,求最大子矩阵使得子矩阵中最大值和最小值的差值<=M. 思路:先看数据大小,注 ...
- HDU 5762 Teacher Bo (鸽笼原理) 2016杭电多校联合第三场
题目:传送门. 题意:平面上有n个点,问是否存在四个点 (A,B,C,D)(A<B,C<D,A≠CorB≠D)使得AB的横纵坐标差的绝对值的和等于CD的横纵坐标差的绝对值的和,n<1 ...
- HDU 5752 Sqrt Bo (思维题) 2016杭电多校联合第三场
题目:传送门. 题意:一个很大的数n,最多开5次根号,问开几次根号可以得到1,如果5次还不能得到1就输出TAT. 题解:打表题,x1=1,x2=(x1+1)*(x1+1)-1,以此类推.x5是不超过l ...
随机推荐
- lxd&openstack-lxd源码剖析
lxd:https://linuxcontainers.org/lxd/,目标是融入到openstack体系被管理,像虚拟机一样被管理使用.从如下图可知,并非走的是libvirt-lxc路线,而是no ...
- 从零开始的Python爬虫速成指南
序 本文主要内容:以最短的时间写一个最简单的爬虫,可以抓取论坛的帖子标题和帖子内容. 本文受众:没写过爬虫的萌新. 入门 0.准备工作 需要准备的东西: Python.scrapy.一个IDE或者随便 ...
- AppCan 之初体验
平台概述 什么是AppCan 移步这里,楼主的一句话:可以匹敌 Phonegap .Titanium .Sencha Touch .MUI .ImagApp.Nitrous .apicloud .起步 ...
- $_SERVER的详细参数整理下
PHP编程中经常需要用到一些服务器的一些资料,特把$_SERVER的详细参数整理下,方便以后使用. $_SERVER['PHP_SELF'] #当前正在执行 脚本的文件名,与 document roo ...
- 解决:Invalid character found in the request target.The valid characters are defined in RFC 7230 and RFC3986
目录 背景 原因分析 处理方法 参考 背景 在将tomcat升级到7.0.81版后,发现系统的有些功能不能使用了,查询日志发现是有些地址直接被tomcat认为存在不合法字符,返回HTTP 400错误响 ...
- nodejs 中on 和 emit
首先测试用例: var EventEmitter = require('events').EventEmitter var life = new EventEmitter(); // life.on( ...
- caffe环境搭建笔记
首先安装以下库或软件 sudo apt-get install gitsudo apt-get install libprotobuf-dev libleveldb-dev l ...
- (三)MySQL终极篇
1.索引 详细介绍:http://www.cnblogs.com/57rongjielong/p/8039452.html 索引是对数据库表中一个或多个列的值进行排序的结构.索引是经过某种算法优化过的 ...
- 解决Max retries exceeded with url的问题
requests.exceptions.ConnectionError: HTTPSConnectionPool(host='itunes.apple.com', port=443): Max ret ...
- 0330复利计算java版
package compounding; import java.util.Scanner; public class compounding1_1 { public static void main ...