PAT 1021 Deepest Root
#include <cstdio>
#include <cstdlib>
#include <vector> using namespace std; class Node {
public:
vector<int> adj;
bool visited;
Node() : visited(false) {}
}; void reset_nodes(vector<Node>& nodes) {
int len = nodes.size();
for (int i=; i<len; i++) {
nodes[i].visited = false;
}
} void dfs(int idx, vector<Node>& nodes, int level, int& deepest) {
if (nodes[idx].visited) return;
Node& node = nodes[idx];
node.visited = true;
if (level > deepest) deepest = level; int len = node.adj.size();
for (int i=; i<len; i++) {
dfs(node.adj[i], nodes, level + , deepest);
}
} int find_deepest_from(int idx, vector<Node>& nodes) {
int deepest = ;
// reset visited flag of all the nodes
reset_nodes(nodes); // find the max level from this node(as root)
dfs(idx, nodes, , deepest); int parts = ;
// check if other parts exist
for (int i = nodes.size() - ; i>=; i--) {
if (!nodes[i].visited) {
int dummy = ;
dfs(i, nodes, , dummy);
parts++;
}
} return parts > ? -parts : deepest;
} int main() {
int N = ;
scanf("%d", &N); vector<Node> nodes(N + ); for (int i=; i<N; i++) {
int a, b;
scanf("%d%d", &a, &b);
nodes[a].adj.push_back(b);
nodes[b].adj.push_back(a);
} int res = ;
vector<int> deepnodes;
int deepest = ;
for (int i=; i<=N; i++) {
res = find_deepest_from(i, nodes);
// not connected graph, stop search
if (res < ) {
break;
}
if (res > deepest) {
deepest = res;
deepnodes.clear();
deepnodes.push_back(i);
} else if (res == deepest) {
deepnodes.push_back(i);
}
}
if (res < ) {
printf("Error: %d components\n", -res);
} else {
int len = deepnodes.size();
for (int i=; i<len; i++) {
printf("%d\n", deepnodes[i]);
}
}
return ;
}
最深root的最远leaf也应该是最深root,利用这个做下优化的话速度应该会快不少。下午改写了一发,时间就有原来的1200ms降到了15ms,可见利用问题中的规律还是很有必要的:
#include <cstdio>
#include <cstdlib>
#include <vector>
#include <set> using namespace std; class Node {
public:
vector<int> adj;
bool visited;
Node() : visited(false) {}
}; void reset_nodes(vector<Node>& nodes) {
int len = nodes.size();
for (int i=; i<len; i++) {
nodes[i].visited = false;
}
} void dfs(int idx, vector<Node>& nodes, int level, int& deepest, set<int>& leaf) {
if (nodes[idx].visited) return;
Node& node = nodes[idx];
node.visited = true;
if (level > deepest) {
deepest = level;
leaf.clear();
leaf.insert(idx);
} else if (level == deepest) {
leaf.insert(idx);
} int len = node.adj.size();
for (int i=; i<len; i++) {
dfs(node.adj[i], nodes, level + , deepest, leaf);
}
} int find_deepest_from(int idx, vector<Node>& nodes, set<int>& leaf) {
int deepest = ;
// reset visited flag of all the nodes
reset_nodes(nodes); // find the max level from this node(as root)
dfs(idx, nodes, , deepest, leaf); int parts = ;
// check if other parts exist
set<int> dummy_leaf;
int dummy_deepest = ;
for (int i = nodes.size() - ; i>=; i--) {
if (!nodes[i].visited) {
dummy_leaf.clear();
dummy_deepest = ;
dfs(i, nodes, , dummy_deepest, dummy_leaf);
parts++;
}
}
if (parts > ) return -parts; reset_nodes(nodes);
vector<int> root(leaf.begin(), leaf.end());
int len = root.size(); for (int i=; i<len; i++) {
dfs(root[i], nodes, , deepest, leaf);
leaf.insert(root[i]);
} return parts > ? -parts : deepest;
} int main() {
int N = ;
scanf("%d", &N); vector<Node> nodes(N + ); for (int i=; i<N; i++) {
int a, b;
scanf("%d%d", &a, &b);
nodes[a].adj.push_back(b);
nodes[b].adj.push_back(a);
} int res = ;
set<int> deepnodes;
int deepest = ;
res = find_deepest_from(, nodes, deepnodes);
// not connected graph
if (res < ) {
printf("Error: %d components\n", -res);
} else {
auto iter = deepnodes.begin();
while (iter != deepnodes.end()) {
printf("%d\n", *iter++);
}
}
return ;
}
PAT 1021 Deepest Root的更多相关文章
- PAT 1021 Deepest Root[并查集、dfs][难]
1021 Deepest Root (25)(25 分) A graph which is connected and acyclic can be considered a tree. The he ...
- [PAT] 1021 Deepest Root (25)(25 分)
1021 Deepest Root (25)(25 分)A graph which is connected and acyclic can be considered a tree. The hei ...
- PAT甲级1021. Deepest Root
PAT甲级1021. Deepest Root 题意: 连接和非循环的图可以被认为是一棵树.树的高度取决于所选的根.现在你应该找到导致最高树的根.这样的根称为最深根. 输入规格: 每个输入文件包含一个 ...
- PAT 甲级 1021 Deepest Root (并查集,树的遍历)
1021. Deepest Root (25) 时间限制 1500 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue A graph ...
- PAT 甲级 1021 Deepest Root (25 分)(bfs求树高,又可能存在part数part>2的情况)
1021 Deepest Root (25 分) A graph which is connected and acyclic can be considered a tree. The heig ...
- PAT 甲级 1021 Deepest Root
https://pintia.cn/problem-sets/994805342720868352/problems/994805482919673856 A graph which is conne ...
- 1021. Deepest Root (25)——DFS+并查集
http://pat.zju.edu.cn/contests/pat-a-practise/1021 无环连通图也可以视为一棵树,选定图中任意一点作为根,如果这时候整个树的深度最大,则称其为 deep ...
- 1021.Deepest Root (并查集+DFS树的深度)
A graph which is connected and acyclic can be considered a tree. The height of the tree depends on t ...
- 1021. Deepest Root (25) -并查集判树 -BFS求深度
题目如下: A graph which is connected and acyclic can be considered a tree. The height of the tree depend ...
随机推荐
- HTML的相关路径与绝对路径的问题---通过网络搜索整理
问题描述: 在webroot中有个index.jsp 在index.jsp中写个表单. 现在在webroot中有个sub文件夹,sub文件夹中有个submit.jsp想得到index.jsp表单 ...
- SpringBoot Maven多模块整合MyBatis 打包jar
最近公司开始新的项目,框架选定为SpringBoot+Mybatis,本篇主要记录了在IDEA中搭建SpringBoot多模块项目的过程. 源码:https://github.com/12641561 ...
- 对IOC的理解
我觉得 IOC 主要分两块去理解, 第一块 IOC是干什么的, 为什么需要IOC ?; 第二块,IOC 这么好,该怎么用? 一: 为什么需要IOC? 回答这个问题就要从ioc的含义入手: IOC ...
- SQL Server 数据类型与.Net Framework平台映射
SQL Server 和 .NET Framework 基于不同的类型系统. 例如,.NET Framework Decimal 结构的最大小数位数为 28,而 SQL Server 的 decim ...
- Fundamentals of Logic
Fundamentals of Logic To make complicated mathematical relationships clear,it is convenient to use t ...
- tomcat添加管理后台的用户名和密码(为jenkins连接tomcat用)
vim ./conf/tomcat-users.xml <role rolename="admin"/> <role rolename="admin- ...
- Qt 学习之路 2(43):QStringListModel
Qt 学习之路 2(43):QStringListModel 豆子 2013年2月13日 Qt 学习之路 2 38条评论 上一章我们已经了解到有关 list.table 和 tree 三个最常用的视图 ...
- Action执行时间过滤器
public class AccessStatisticsAttribute : ActionFilterAttribute { /// <summary> /// log4net 日志 ...
- 1、在linux服务器centos虚拟机搭建nginx网站
1.搭建linux虚拟机 具体参考 http://jingyan.baidu.com/article/86112f135e584a273697876b.html (如何在WIN7下进行LINUX虚拟机 ...
- EntityFramework CodeFirst 数据库迁移
参考: https://msdn.microsoft.com/en-us/data/jj591621 https://msdn.microsoft.com/en-us/library/dd394698 ...