题目链接


题目大意:


题目解法:

  1. 首先我们先对这个图求一个dfs树dfs树dfs树,那么对dfs树dfs树dfs树求树的直径rrr如果⌈n2⌉≤r\lceil\frac{n}{2}\rceil\leq r⌈2n​⌉≤r直接输出答案就好了
  2. 如果不是对于第二怎么求呢?我们知道对于⌈n2⌉≤r\lceil\frac{n}{2}\rceil\leq r⌈2n​⌉≤r那么肯定这个dfsdfsdfs树的深度deepdeepdeep是deep≤⌊n2⌋deep \leq \lfloor\frac{n}{2}\rfloordeep≤⌊2n​⌋
  3. 那么我们可以这么构造:对于同一个深度的我们两两匹配就可以了,根据无向图的dfs树同一个深度的节点原图中肯定是没有边的
  4. 因为是两两匹配每层最多浪费一个,那么用到的点集肯定有⌈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树的性质)相关推荐

  1. 图论复习——dfs树,点双,边双,强连通分量

    知识点 dfs树 对一个图运行 dfs 算法,每个点uuu的父亲定义为第一次遍历uuu时的前驱结点,若无则为根. 无向图的 dfs树 没有横叉边. 有向图的 dfs树 横叉边方向唯一,总是从后访问的点 ...

  2. 实现教材算法7.2利用邻接矩阵构造无向图的算法,在此基础上进行深度优先遍历和广度优先遍历。

    软件学院实验报告 姓名:              学号:              专业:               年级: 课程名称 数据结构 实验名称 实验9.图的遍历 实验的准备阶段 实验内 ...

  3. 图论 ---- 构造DFS树的思想 K - Boomerangs Gym - 102001K

    题目链接 题目大意: 解题思路: 启发性思考首先我们先图切成dfs树,然后给图一个稳定结构之后,我们就可以去构造了 对于每个点我们从第底端开始构造每次把每次点的儿子两两匹配,如果是奇数个儿子就把多出来 ...

  4. 本科课程【数据结构与算法】实验4—— 构造哈夫曼树、深度优先搜索

    大家好,我是[1+1=王], 热爱java的计算机(人工智能)渣硕研究生在读. 如果你也对java.人工智能等技术感兴趣,欢迎关注,抱团交流进大厂!!! Good better best, never ...

  5. Algorithm:C++语言实现之图论算法相关(图搜索广度优先BFS、深度优先DFS,最短路径SPF、带负权的最短路径Bellman-ford、拓扑排序)

    Algorithm:C++语言实现之图论算法相关(图搜索广度优先BFS.深度优先DFS,最短路径SPF.带负权的最短路径Bellman-ford.拓扑排序) 目录 一.图的搜索 1.BFS (Brea ...

  6. huffman树_笃学不倦|c语言构造哈夫曼树哈夫曼编码

    艾薇巴蒂!许久不见甚是想念,想必这"涨姿势"的时刻大家已经期待许久了!今天我们要共同学习的是c语言构造哈夫曼树-哈夫曼编码 构造哈夫曼树 首先,我们需要了解哈夫曼树是什么: 相关知 ...

  7. 由二叉树构造赫夫曼树

    赫夫曼树: 假设有n个权值{w1,w2,w3....},试构造一棵具有 n个叶子节点的二叉树,每个叶子节点带权为wi,则其中 带权路径长度最小的二叉树称为最优二叉树或者叫赫夫曼树. 构造赫夫曼树: 假 ...

  8. pta 构造哈夫曼树-有序输入 优先队列做法

    pta 构造哈夫曼树-有序输入 优先队列做法 构造哈夫曼树,然后输出它树的中序序列. 从小到大的顺序给出词频(不超过10个),根据词频构造哈夫曼树. 为确保构建的哈夫曼树唯一,本题做如下限定: (1) ...

  9. 构造哈夫曼树和哈夫曼编码

    //哈夫曼树 #include<iostream> #include<cstring> using namespace std; typedef struct {int wei ...

最新文章

  1. 2017云计算及工业物联网论坛即将于广州开幕
  2. ContentValues(Java)
  3. chart控件做实时曲线显示_Python 如何实时绘制数据
  4. Neo4j:使用Cypher生成实时建议
  5. java学习(15):巩固练习
  6. 微信广告任务平台源码运营版
  7. python 连接mysql_使用MySQL
  8. 车主高速充电1小时排队4小时 国庆高速公路每日充电量创新高
  9. linux减小根目录空间_Linux目录结构及文件基本操作详解
  10. WP7基础学习---第一讲
  11. java se开发工具_JavaSE基础代码(1)-Hi ShanShi与开发工具
  12. 【软件】强大的EPWING格式的日语词典
  13. Windows7安装java
  14. 谷歌学术文献信息爬取及文献下载
  15. SSH2(Struts2、Spring3与Hibernate3)的整合
  16. 实训第二天的代码优化
  17. USB device for mac
  18. 51实现todos-完整js
  19. 十三个提高远程办公效率的工具
  20. 2022 个人基本计划

热门文章

  1. 把路由器啥啥从 啥啥写入 NVRAM 的命令是 (53) 。【两道题】【不知道对不对,哈哈】
  2. 教程 | OpenCV深度神经网络实现人体姿态评估
  3. 你不知道的车牌识别系统
  4. OpenCV中图像形态学操作
  5. LOJ6435 PKUSC2018 星际穿越
  6. java B2B2C Springcloud多租户电子商城系统-(七)高可用的分布式配置中心(Spring Cloud Config)...
  7. 20道常见初级Java面试题
  8. 如何在同一台电脑开启多个tomcat服务器
  9. 通过NFS实现简单的文件共享
  10. linux 软件安装基本操作