博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
中南多校对抗赛 第三场 E
阅读量:5109 次
发布时间:2019-06-13

本文共 2559 字,大约阅读时间需要 8 分钟。

E:Eulerian Flight Tour

题意:

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

题解:

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

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

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

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

分类讨论:

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

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

代码:

# E:Eulerian Flight Tour## 题意:给你一张无向图,要你给这个图加边使得其形成一个欧拉回路## 题解:首先使得所有节点的度都为偶数,然后将这个图联通起来对于度为奇数的点,将将他和他的父节点连接起来连接完后如果这个图是联通的,那么就直接输出结果如果这个图有多个联通块:分类讨论:如果有2个联通块,两个联通块对着连成一个环如果有多个联通块,用一个环将这几个联通块连起来即可代码:```c++#include
using namespace std;typedef pair
pii;#define FIN freopen("input.txt","r",stdin);const int maxn = 4e3 + 5;int n, m;int vis[maxn];int deg[maxn];bool G[maxn][maxn];bool flag;vector
ans;void dfs(int u, int p) { vis[u] = 1; for(int v = 1; v <=n; v++) { if(vis[v]) continue; if(G[u][v]) continue; dfs(v, u); } if(deg[u] & 1) { if(p == -1) flag = false; else { ans.push_back(make_pair(u, p)); deg[u]++, deg[p]++; G[u][p] = G[p][u] = 1; } }}vector
tmp;vector
> A;void dfs1(int u) { vis[u] = 1; for(int v = 1; 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,0,sizeof(deg)); memset(G,0,sizeof(G)); for(int i = 0, u, v; i < m; i++) { cin >> u >> v;// u--,v--; deg[u]++, deg[v]++; G[u][v] = G[v][u] = 1; }// cout<<"hhh"<
A[1].size()) swap(A[0], A[1]); if (A[0].size() == 1) { int t = A[0][0]; int u = -1, v=-1; for (int i = 0; i < A[1].size(); ++i) { for(int j = i + 1; j < A[1].size(); ++j) { int cu = A[1][i], cv = A[1][j]; if (!G[cu][cv]) u = cu, v = cv; } } if (u == -1) { if (ans.size() == 0) { cout << -1 << endl; return 0; } 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 = 0; it < 2; ++it) { for (int it2 = 0; it2 < 2; ++it2) { ans.push_back(make_pair(A[0][it], A[1][it2])); } } } } else if (A.size() > 2) { for (int i = 0; i < A.size(); ++i) { int j = (i + 1) % A.size(); ans.push_back(make_pair(A[i][0], A[j][0])); } } cout << ans.size() << endl; for (int i = 0; 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 0;}```
View Code

 

 

转载于:https://www.cnblogs.com/buerdepepeqi/p/10630195.html

你可能感兴趣的文章
rsync
查看>>
java中的IO操作总结
查看>>
noip模拟赛 党
查看>>
bzoj2038 [2009国家集训队]小Z的袜子(hose)
查看>>
Java反射机制及其Class类浅析
查看>>
Postman-----如何导入和导出
查看>>
JBOSS内存参数详解
查看>>
Centos7下关于系统用户密码规则-运维笔记
查看>>
nginx 杂记
查看>>
面试题17:合并两个排序的链表
查看>>
Jmeter HTTPS接口测试的证书导入
查看>>
Hibernate之Hibernate环境搭建
查看>>
php 计算概率,可以任意添加
查看>>
tms320dm6446内核启动分析 分类: DSP ...
查看>>
FZU 1856 The Troop (JAVA高精度)
查看>>
@Override annotation 出错
查看>>
在cnblog中使用syntax方法
查看>>
二分查找原理和实现
查看>>
SpringMVC responseBody注解分析
查看>>
Java基础---集合
查看>>