图论 ---- E. Pairs of Pairs(构造+无向图的dfs树的性质)
题目链接
题目大意:
题目解法:
- 首先我们先对这个图求一个dfs树dfs树dfs树,那么对dfs树dfs树dfs树求树的直径rrr如果⌈n2⌉≤r\lceil\frac{n}{2}\rceil\leq r⌈2n⌉≤r直接输出答案就好了
- 如果不是对于第二怎么求呢?我们知道对于⌈n2⌉≤r\lceil\frac{n}{2}\rceil\leq r⌈2n⌉≤r那么肯定这个dfsdfsdfs树的深度deepdeepdeep是deep≤⌊n2⌋deep \leq \lfloor\frac{n}{2}\rfloordeep≤⌊2n⌋
- 那么我们可以这么构造:对于同一个深度的我们两两匹配就可以了,根据无向图的dfs树同一个深度的节点原图中肯定是没有边的
- 因为是两两匹配每层最多浪费一个,那么用到的点集肯定有⌈n2⌉\lceil\frac{n}{2}\rceil⌈2n⌉
AC code
#include <bits/stdc++.h>
#define mid ((l + r) >> 1)
#define Lson rt << 1, l , mid
#define Rson rt << 1|1, mid + 1, r
#define ms(a,al) memset(a,al,sizeof(a))
#define log2(a) log(a)/log(2)
#define lowbit(x) ((-x) & x)
#define IOS std::ios::sync_with_stdio(0); cin.tie(0); cout.tie(0)
#define INF 0x3f3f3f3f
#define LLF 0x3f3f3f3f3f3f3f3f
#define f first
#define s second
#define endl '\n'
using namespace std;
const int N = 2e6 + 10, mod = 1e9 + 9;
const int maxn = 2e6 + 10;
const long double eps = 1e-5;
const int EPS = 500 * 500;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> PII;
typedef pair<ll,ll> PLL;
typedef pair<double,double> PDD;
template<typename T> void read(T &x) {x = 0;char ch = getchar();ll f = 1;while(!isdigit(ch)){if(ch == '-')f*=-1;ch=getchar();}while(isdigit(ch)){x = x*10+ch-48;ch=getchar();}x*=f;
}
template<typename T, typename... Args> void read(T &first, Args& ... args) {read(first);read(args...);
}
int n, m;
vector<int> G[maxn], dfstree[maxn], deep[maxn], dir;
vector<PII> ans;
bool vis[maxn];
int d[maxn];
inline void dfsgraphe(int u) {vis[u] = 1;for(auto it : G[u]) {if(vis[it]) continue;dfsgraphe(it);dfstree[u].push_back(it);dfstree[it].push_back(u);}
}
int path[2], last[maxn];
inline void find(int u, int fa, int now) {if(now) last[u] = fa;for(auto it : dfstree[u]) {if(it == fa) continue;d[it] = d[fa] + 1;if(d[it] > d[path[now]]) path[now] = it;find(it,u,now);}
}inline void getans(int u, int fa, int depth) {// cout << u << " <- " << fa <<endl;deep[depth].push_back(u);for(auto it : dfstree[u]) {if(it == fa) continue;getans(it,u,depth+1);}
}inline void init() {for(int i = 0; i <= n; ++ i) G[i].clear(), deep[i].clear(), dfstree[i].clear(), vis[i] = 0, d[i] = 0, last[i] = 0;path[0] = path[1] = 0;ans.clear();dir.clear();
}int main() {IOS;int _;cin >> _;while(_--) {cin >> n >> m;init();for(int i = 1; i <= m; ++ i) {int u, v;cin >> u >> v;G[u].push_back(v);G[v].push_back(u);} dfsgraphe(1);find(1,0,0);d[path[0]] = 0;find(path[0],0,1);int p = path[1];do {dir.push_back(p);p = last[p];}while(p);if(dir.size() >= (n + 1) / 2) {cout << "PATH\n";cout << dir.size() << endl;for(auto it : dir)cout << it << " ";cout << endl;} else {getans(1,0,0);for(int i = 0; i <= m; i ++) {for(int j = 0; j < deep[i].size(); j += 2) if(j + 1 < deep[i].size()) ans.push_back({deep[i][j],deep[i][j+1]});}cout << "PAIRING\n";cout << ans.size() << endl;for(auto it : ans)cout << it.first << " " << it.second << endl;}}return 0;
}
*/
图论 ---- E. Pairs of Pairs(构造+无向图的dfs树的性质)相关推荐
- 图论复习——dfs树,点双,边双,强连通分量
知识点 dfs树 对一个图运行 dfs 算法,每个点uuu的父亲定义为第一次遍历uuu时的前驱结点,若无则为根. 无向图的 dfs树 没有横叉边. 有向图的 dfs树 横叉边方向唯一,总是从后访问的点 ...
- 实现教材算法7.2利用邻接矩阵构造无向图的算法,在此基础上进行深度优先遍历和广度优先遍历。
软件学院实验报告 姓名: 学号: 专业: 年级: 课程名称 数据结构 实验名称 实验9.图的遍历 实验的准备阶段 实验内 ...
- 图论 ---- 构造DFS树的思想 K - Boomerangs Gym - 102001K
题目链接 题目大意: 解题思路: 启发性思考首先我们先图切成dfs树,然后给图一个稳定结构之后,我们就可以去构造了 对于每个点我们从第底端开始构造每次把每次点的儿子两两匹配,如果是奇数个儿子就把多出来 ...
- 本科课程【数据结构与算法】实验4—— 构造哈夫曼树、深度优先搜索
大家好,我是[1+1=王], 热爱java的计算机(人工智能)渣硕研究生在读. 如果你也对java.人工智能等技术感兴趣,欢迎关注,抱团交流进大厂!!! Good better best, never ...
- Algorithm:C++语言实现之图论算法相关(图搜索广度优先BFS、深度优先DFS,最短路径SPF、带负权的最短路径Bellman-ford、拓扑排序)
Algorithm:C++语言实现之图论算法相关(图搜索广度优先BFS.深度优先DFS,最短路径SPF.带负权的最短路径Bellman-ford.拓扑排序) 目录 一.图的搜索 1.BFS (Brea ...
- huffman树_笃学不倦|c语言构造哈夫曼树哈夫曼编码
艾薇巴蒂!许久不见甚是想念,想必这"涨姿势"的时刻大家已经期待许久了!今天我们要共同学习的是c语言构造哈夫曼树-哈夫曼编码 构造哈夫曼树 首先,我们需要了解哈夫曼树是什么: 相关知 ...
- 由二叉树构造赫夫曼树
赫夫曼树: 假设有n个权值{w1,w2,w3....},试构造一棵具有 n个叶子节点的二叉树,每个叶子节点带权为wi,则其中 带权路径长度最小的二叉树称为最优二叉树或者叫赫夫曼树. 构造赫夫曼树: 假 ...
- pta 构造哈夫曼树-有序输入 优先队列做法
pta 构造哈夫曼树-有序输入 优先队列做法 构造哈夫曼树,然后输出它树的中序序列. 从小到大的顺序给出词频(不超过10个),根据词频构造哈夫曼树. 为确保构建的哈夫曼树唯一,本题做如下限定: (1) ...
- 构造哈夫曼树和哈夫曼编码
//哈夫曼树 #include<iostream> #include<cstring> using namespace std; typedef struct {int wei ...
最新文章
- 2017云计算及工业物联网论坛即将于广州开幕
- ContentValues(Java)
- chart控件做实时曲线显示_Python 如何实时绘制数据
- Neo4j:使用Cypher生成实时建议
- java学习(15):巩固练习
- 微信广告任务平台源码运营版
- python 连接mysql_使用MySQL
- 车主高速充电1小时排队4小时 国庆高速公路每日充电量创新高
- linux减小根目录空间_Linux目录结构及文件基本操作详解
- WP7基础学习---第一讲
- java se开发工具_JavaSE基础代码(1)-Hi ShanShi与开发工具
- 【软件】强大的EPWING格式的日语词典
- Windows7安装java
- 谷歌学术文献信息爬取及文献下载
- SSH2(Struts2、Spring3与Hibernate3)的整合
- 实训第二天的代码优化
- USB device for mac
- 51实现todos-完整js
- 十三个提高远程办公效率的工具
- 2022 个人基本计划