title: WOJ1024 (POJ1985+POJ2631) Exploration 树/BFS

date: 2020-03-20 10:43:00

categories: acm

tags: [acm,woj,图论]

用到了树的 直径

1 描述

Tom is an explorer and now he is in a mysterious cave. He finds that there are lots of rooms in it. You are ensured that these rooms are connected together by some roads and there is only one way between any two rooms. That is, all the rooms are connected as a tree.

Now, Tom wants to travel all the rooms in this mysterious cave. The roads and rooms can be passed more than once. But there are too many rooms here and he doesn?t want to waste too much time and wants to find a walking sequence which can minimum the distance he walks. Note, Tom can select any room in the cave as the start point in his exploration.

Given the distance of roads in the cave, please write a program to calculate the minimum distance Tom has to go in his exploration.

输入格式

Standard input will contain multiple test cases. The first line of the input if a single integer T (1 <= T <= 50) which is the number of test cases.

Each test case starts with an integer N (2 <= N <= 50000), which is the number of the rooms. The following N - 1 lines contains three integers each, u (1 <= u <= N), v (1 <= v <= N) and d (1 <= d <= 2000). u and v is the serial number of the rooms and d is the distance between Room u and Room v .Note that, the serial numbers of the rooms start at 1.

输出格式

Results should be directed to standard output. Start each case with "Case #:" on a single line, where # is the case number starting from 1. Two consecutive cases should be separated by a single blank line. No blank line should be produced after the last test case.

For each test case, print a line containing the minimum distance Tom should go.

样例输入

2

2

1 2 3

3

1 2 3

1 3 4

样例输出

Case 1:

3

Case 2:

7

2 分析

给一棵树(节点间只有一条路(可能无边)),节点间边有正权。求从任一节点开始遍历这棵树所有点的最小权(节点可重复经过)

笔记加一条 数据结构-树的性质。树性质是向上只有一个节点,向下有没有限制个节点。(好像没什么用),

画图知道无论从哪个点开始沿一条边出发,把经过这条边可以到达的点看成集合A,整个树为集合T,要想去T-S,必然要原路返回到起始点

(就是说把这个点砍了就是二分图)。所以这题看成两个过程,先是从起始点s遍历A,然后从最后到的点返回到起始点s,再遍历T-S

然后再画图可知从哪个点开始都是一样的(大雾,不一样!)

然后我感觉做过这种题,搜了一下想起来了,只需要找到树的直径然后直径上其他的树枝走两遍就行了,直径只走一遍

然后转化为无根树求直径的问题.

两次DFS/BFS都可以。任选一点做DFS,找到的最长点再做DFS,再次找到的最长点就是直径

//当然最短路Bellmanford 等算法也可以

类似的题POJ1985+POJ2631

3 code

#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
using namespace std;
struct Node{
int v,d;
}; int n,dis[50001];
vector<Node> tree[50001];
Node tmp1,tmp2;
int T,casee=0;
int u,v,d,i,ans,faresta,tpans; int BFS(int x)
{
for(i=0;i<=n;i++) //n.输入点的index到了n,一开始顺手写成n-1了
dis[i]=0;
int vis[n+5];
memset(vis,0,sizeof(vis));
queue<int> q;
q.push(x);
vis[x]=1;
int point = 1;
while(!q.empty())
{
int f=q.front();
q.pop();
if(dis[f]>tpans)
{
tpans = dis[f];
point = f;
}
for(i=0;i<tree[f].size();i++)
{
Node tmp = tree[f][i];
if(vis[tmp.v]==0)
{
vis[tmp.v]=1;
dis[tmp.v] = dis[f] + tmp.d;
q.push(tmp.v);
}
}
}
return point;
} void build(){
for(i=1;i<=n;i++)
tree[i].clear();
ans=0;
for(i=0;i<n-1;i++){
cin>>u>>v>>d;
tmp1.v=v;tmp1.d=d;
tmp2.v=u;tmp2.d=d;
tree[u].push_back(tmp1); //相连的边,点
tree[v].push_back(tmp2);
ans=ans+2*d;
}
return;
} int main(){ cin>>T;
while(T--){
ans=0;
if(casee!=0)
cout<<endl;
casee++;
cin>>n;
build(); tpans=0;
faresta=BFS(1);
tpans=0;
BFS(faresta);
printf("Case %d:\n",casee);
cout<<ans-tpans<<endl;
}
system("pause");
return 0;
}

WOJ1024 (POJ1985+POJ2631) Exploration 树/BFS的更多相关文章

  1. poj1985 / poj2631(树的直径)

    poj1985 Cow Marathon 树的直径裸题 树的直径的一般求法: 任意一点为起点,dfs/bfs找出与它最远的点$u$ 以$u$为起点,dfs/bfs找出与它最远的点$v$ 则$d(u,v ...

  2. poj2631 求树的直径裸题

    题目链接:http://poj.org/problem?id=2631 题意:给出一棵树的两边结点以及权重,就这条路上的最长路. 思路:求实求树的直径. 这里给出树的直径的证明: 主要是利用了反证法: ...

  3. 1021. Deepest Root (25) -并查集判树 -BFS求深度

    题目如下: A graph which is connected and acyclic can be considered a tree. The height of the tree depend ...

  4. BZOJ3073 PA2011Journeys(线段树+bfs)

    线段树优化建图裸题.建两棵线段树,一棵表示入一棵表示出.对题中所给的边新建一个虚拟点,将两段区间拆成线段树上对应区间,出线段树中对应区间所表示的点向虚拟点连边权0的边,虚拟点向入线段树中对应区间所表示 ...

  5. CF1076D Edge Deletion 最短路径树+bfs

    题目描述 You are given an undirected connected weighted graph consisting of n n n vertices and m m m edg ...

  6. LeetCode Top100 Liked Questions

    1. TwoSum https://www.cnblogs.com/zhacai/p/10429120.html  easy 2. Add Two Numbers https://www.cnblog ...

  7. 【spoj8222-Substrings】sam求子串出现次数

    http://acm.hust.edu.cn/vjudge/problem/28005 题意:给一个字符串S,令F(x)表示S的所有长度为x的子串中,出现次数的最大值.求F(1)..F(Length( ...

  8. 关于SAM和广义SAM

    关于SAM和广义SAM 不是教程 某些思考先记下来 SAM 终于学会了这个东西诶...... 一部分重要性质 确定一个重要事情,S构造出的SAM的一个重要性质是当且仅当对于S的任意一个后缀,可以从1号 ...

  9. ACM模板_axiomofchoice

    目录 语法 c++ java 动态规划 多重背包 最长不下降子序列 计算几何 向量(结构体) 平面集合基本操作 二维凸包 旋转卡壳 最大空矩形 | 扫描法 平面最近点对 | 分治 最小圆覆盖 | 随机 ...

随机推荐

  1. MySQL全面瓦解18:自定义函数

    定义 我们之前学习了MySQL的内置函数,非常丰富,满足了我们对数据操作的大部分需求. 但是如果有一些复杂的业务逻辑在数据库层面就可以完成,无需在程序层面完成的时候,这时候就可以写成MySQL自定义函 ...

  2. Ubuntu Terminal命令行新建仓库并推送到远程仓库

    通常情况下,在本地新建一个仓库之后,需要在远端网页端也新建一个空的同名仓库,然后将两者进行关联才能推送. 那有没有办法直接在命令行就完成从新建到推送的过程而不需要中间在网页端也操作一番呢?办法当然是有 ...

  3. 一文搞定全场景K3s离线安装

    作者简介 王海龙,Rancher中国社区技术经理,负责Rancher中国技术社区的维护和运营.拥有6年的云计算领域经验,经历了OpenStack到Kubernetes的技术变革,无论底层操作系统Lin ...

  4. Python+Selenium+Unittest实现PO模式web自动化框架(4)

    1.PageLocators目录下的具体模块 2.PageLocators目录下主要放置个页面的元素定位.用于统一管理个页面的定位元素. 例如:登录页面的元素定位login_page_locator. ...

  5. 基于nginx的频率控制方案思考和实践

    基于nginx的频率控制方案思考 标签: 频率控制 nginx 背景 nginx其实有自带的limit_req和limit_conn模块,不过它们需要在配置文件中进行配置才能发挥作用,每次有频控策略的 ...

  6. Jenkins部署web项目到Tomcat(热部署)

    使用这个方式的话需要tomcat中有初始时Manage这个项目,本质上是通过http://ip:port/manager/html这个地址的上传接口进行上传,进行热部署(需要远程tomcat 必须开启 ...

  7. 【算法】数位 dp

    时隔多日,我终于再次开始写博客了!! 上午听了数位 dp,感觉没听懂,于是在网上进行一番愉 ♂ 快 ♀ 的学习后,写篇博来加深一下印象~~ 前置的没用的知识 数位 不同计数单位,按照一定顺序排列,它们 ...

  8. java打exe

    参考文章: 注册码: https://www.cnblogs.com/jepson6669/p/9211208.html 官网: https://exe4j.apponic.com/ 在上篇基础上,将 ...

  9. BootstrapValidator验证规则、BootStrap表格:列参数

    BootstrapValidator验证规则 需引用组件 <script src="~/Scripts/jquery-1.10.2.js"></script> ...

  10. python函数的实例,书写一个创建有针对性的专用密码字典的程序

    python学习,实战学习,函数的学习与使用,综合知识的运用.包括for ,while循环,if...else.. 和if... elif ... else 的条件判断! 问题描述:书写一个创建有针对 ...