中南多校对抗赛 第三场 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 ...
随机推荐
- VSCode打开已有vuejs项目
转载自 https://blog.csdn.net/yoryky/article/details/78290443 下载安装并配置VSCode 随便百度上搜个最新的VSCode安装好后,点击Ctrl ...
- sql批量更新
-----------------更新无锡医院名称 update Opt_DKI_Hospital set centerName =tmp.[医院名称] from Opt_DKI_Hospital h ...
- python中Requests模块中https请求在设置为忽略有效性验证,屏蔽告警信息的方式
增加下面的就ok了from requests.packages.urllib3.exceptions import InsecureRequestWarningrequests.packages.ur ...
- php 通过curl上传图片
通过curl上传图片 PHP < 5.5: 使用 目前使用的php版本 7.1 测试无法使用 前面加@ 的方法上传文件 ,查找资料 使用 curl_setopt($ch,CURLOPT_SAFE ...
- Visiting a Friend(思维)
Description Pig is visiting a friend. Pig's house is located at point 0, and his friend's house is l ...
- Java接口interface,匿名内部类
接口 1.接口内部为 常量+公用的抽象方法.类必须实现接口中的所有方法 2.接口的语法格式:不写abstract会自动添加,可以继承多个接口 修饰符不能使private,protected [修饰符] ...
- c# byte转docx
问题情境: docx文件放进resource中,再用程序读出来的时候是二进制数组. 解决办法: public string ByteConvertWord(byte[] data, string fi ...
- 团队作业4——第一次项目冲刺(Alpha版本)第二次
一.会议内容 各人进行下一步工作 发现沟通流程问题并解决 二.各人工作 成员 计划任务 遇见难题 贡献比 塗家瑜(组长) 后端逻辑处理 无 1 张新磊 数据库搭建 无 1 姚燕彬 测试计划编写 无 1 ...
- Java try catch
/* 异常处理的捕捉形式: 这是可以对异常进行针对性处理的方式. 具体格式是: try { //需要被检测异常的代码. } catch(异常类 变量)//该变量用于接收发生的异常对象 { // ...
- Qt容器类汇总说明
版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:Qt容器类汇总说明 本文地址:http://techieliang.com/2017/ ...