hdu2196 树的直径 + bfs
//Accepted 740 KB 15 ms
//树的直径
//距离一个顶点最远的点一定是树的直径的一个端点
#include <cstdio>
#include <cstring>
#include <queue>
#include <iostream>
using namespace std;
;
int dis[imax_n];
int d1[imax_n];
int d2[imax_n];
int head[imax_n];
*imax_n];
int e;
struct node
{
int u,v,c;
node()
{
}
node(int u,int v,int c)
{
this->u=u;
this->v=v;
this->c=c;
}
}p[*imax_n];
int n;
void addEdge(int u,int v,int c)
{
p[e]=node(u,v,c);
next[e]=head[u];
head[u]=e++;
}
void init()
{
memset(head,-,sizeof(head));
memset(next,-,sizeof(next));
e=;
}
void read()
{
init();
int x,y;
;i<=n;i++)
{
scanf("%d%d",&x,&y);
addEdge(i,x,y);
addEdge(x,i,y);
}
}
int max(int a,int b)
{
return a>b?a:b;
}
queue<int >q;
bool vis[imax_n];
int bfs(int s)
{
//printf("111111\n");
memset(dis,,sizeof(dis));
;
int temp_node;
while (!q.empty()) q.pop();
memset(vis,,])*(n+));
q.push(s);
vis[s]=;
while (!q.empty())
{
int x=q.front();
if (dis[x]>ans)
{
ans=dis[x];
temp_node=x;
}
q.pop();
;i=next[i])
{
int y=p[i].v;
if (!vis[y])
{
vis[y]=;
q.push(y);
if (dis[x]+p[i].c>dis[y])
dis[y]=dis[x]+p[i].c;
}
}
}
return temp_node;
}
int main()
{
while (scanf("%d",&n)!=EOF)
{
read();
);
x=bfs(x);
memcpy(d1,dis,sizeof(dis));
bfs(x);
memcpy(d2,dis,sizeof(dis));
;i<=n;i++)
{
printf("%d\n",max(d1[i],d2[i]));
}
}
;
}
hdu2196 树的直径 + bfs的更多相关文章
- poj2631 树的直径 + bfs
//Accepted 492 KB 0 ms //树的直径 bfs #include <cstdio> #include <cstring> #include <iost ...
- 树上选两点(使最短)树的直径+bfs
题意: 给你一颗树,让你放两个点,放在哪里的时候任意点到某个最近的消防站最远值最小. 思路: 树的直径类题目. 首先我们想两个点会把整棵树分成两个团,所以肯定会在树的某个链上切开. 而且要切一定切在树 ...
- ZOJ 3820 Building Fire Stations 求中点+树的直径+BFS
题意:给一棵树,要求找出两个点,使得所有点到这两个点中距离与自己较近的一个点的距离的最大值(所有点的结果取最大的值,即最远距离)最小. 意思应该都能明白. 解法:考虑将这棵树摆直如下: 那么我们可以把 ...
- luogu P3761 [TJOI2017]城市 树的直径 bfs
LINK:城市 谢邀,学弟说的一道毒瘤题. 没有真正的省选题目毒瘤 或者说 写O(n)的做法确实毒瘤. 这里给一个花20min就写完的非常好写的暴力. 容易想到枚举哪条边删掉 删掉之后考虑在哪两个点上 ...
- POJ1985 树的直径(BFS
Cow Marathon Description After hearing about the epidemic of obesity in the USA, Farmer John wants ...
- 树的直径(BFS)
][];];];];,,;vis[i]=; ; j <= n ; j++){ ){;//标记 res[j]=res[root]+; ; i <= n- ; i++){; data[b][a ...
- [USACO2004][poj1985]Cow Marathon(2次bfs求树的直径)
http://poj.org/problem?id=1985 题意:就是给你一颗树,求树的直径(即问哪两点之间的距离最长) 分析: 1.树形dp:只要考虑根节点和子节点的关系就可以了 2.两次bfs: ...
- 4612 warm up tarjan+bfs求树的直径(重边的强连通通分量)忘了写了,今天总结想起来了。
问加一条边,最少可以剩下几个桥. 先双连通分量缩点,形成一颗树,然后求树的直径,就是减少的桥. 本题要处理重边的情况. 如果本来就两条重边,不能算是桥. 还会爆栈,只能C++交,手动加栈了 别人都是用 ...
- HDU4612+Tarjan缩点+BFS求树的直径
tarjan+缩点+树的直径题意:给出n个点和m条边的图,存在重边,问加一条边以后,剩下的桥的数量最少为多少.先tarjan缩点,再在这棵树上求直径.加的边即是连接这条直径的两端. /* tarjan ...
随机推荐
- 使用分布式数据库集群做大数据分析之OneProxy
一.十亿数据,轻松秒出 实时监控领域有两个显著的特点,一是数据来源很多而且数据量大,有来自监控摄像头.GPS.智能设备等:二是需要实时处理.我们的客户在做实时处理时,就遇到这样的问题.客户的某个数据表 ...
- IEnumerable接口的实现
对象要实现可以迭代需IEnumerable接口并实现GetEnumerator方法.一下简单例子 public class SPEnumerable<T> : IEnumerable { ...
- 【转】 探索UDP套接字编程
UDP和TCP处于同一层网络模型中,也就是运输层,基于二者之上的应用有很多,常见的基于TCP的有HTTP.Telnet等,基于UDP有DNS.NFS.SNMP等.UDP是无连接,不可靠的数据协议服务, ...
- 华为面试题——约瑟夫问题的C++简单实现(循环链表)
/* author:jiangxin Blog:http://blog.csdn.net/jiangxinnju Function:method of Josephus que ...
- 日期操作类--DateFormat类
简单的DateFormat格式化编码 时间模式字符串用来指定时间格式.在此模式中,所有的ASCII字母被保留为模式字母,定义如下: 字母 描述 示例 G 纪元标记 AD y 四位年份 2001 M 月 ...
- [saiku] 集成单点登录
思路: 自定义一个loginCallbackFilter用于单点登录成功后执行模拟用户认证授权登录的操作. 当授权成功后所有配置需要授权才能访问的url就再也不会被任何filter拦截,可随意访问了. ...
- python中的异常处理
主要用到 try...except...raise...finally... 1. try...except... try: for i in range(1, 1000): print i time ...
- Linux服务器下用svn创建多个项目
(1): 创建svn仓库路径 mkdir -p /opt/svn/project1 mkdir -p /opt/svn/project2 svnadm ...
- border用处多
1. 使用border属性实现梯形 给定一个div,通过设定div四个边框不同的颜色且设置比较粗的边框线条,可以看到div除了中间的content部分,四个边框均成梯形状,既然已经有了梯形的雏形 ...
- DataTable 中Distinct操作
DataTable dt = ds.Tables[]; DataView dataView = dt.DefaultView; DataTable dtDistinct = dataView.ToTa ...