HDU 5423:Rikka with Tree Dijkstra算法
Rikka with Tree
众所周知,萌萌哒六花不擅长数学,所以勇太给了她一些数学问题做练习,其中有一道是这样的: 对于一棵树TT,令F(T,i)F(T,i)为点1到点ii的最短距离(边长是1). 两棵树AA和BB是相似的当且仅当他们顶点数相同且对于任意的ii都有F(A,i)=F(B,i)F(A,i)=F(B,i). 两棵树AA和BB是不同的当且仅当他们定点数不同或者存在一个ii使得以1号点为根的时候ii在两棵树中的父亲不同。 一棵树AA是特殊的当且仅当不存在一棵和它不同的树和它相似。 现在勇太想知道一棵树到底是不是特殊的。 当然,这个问题对于萌萌哒六花来说实在是太难了,你可以帮帮她吗?
数据组数不超过100组。每组数据的第一行一个整数n(2 \leq n \leq 1000)n(2≤n≤1000)。 接下来n-1n−1行。每行两个整数u,v(1 \leq u,v \leq n)u,v(1≤u,v≤n),代表给定树上的一条边。
对于每一组数据,如果给定树是特殊的输出"YES"否则输出"NO"。
3
1 2
2 3
4
1 2
2 3
1 4
YES
NO
对于第二组数据下面这棵树和它相似。
4
1 2
1 4
3 4
官方题解:显然一棵树是独特的当且仅当任意处于每一个深度的点数是"1 1 1 1 ... 1 1 x"。所以直接DFS一下求出每一个点到根的距离然后判断一下就好了 。
看到从1到各个点的最短距离,就想到Dijkstra了。用Dijkstra求每个点的最短路径,之后在对最大值做判断即可。
代码:
#include <iostream>
#include <algorithm>
#include <cmath>
#include <vector>
#include <string>
#include <cstring>
#pragma warning(disable:4996)
using namespace std; const int MAX = 0xfffffff;
int edge[1005][1005];
int vist[1005], minidis[1005];
int num; void init()
{
int i, j;
memset(vist, 0, sizeof(vist)); for (i = 1; i <= num; i++)
{
for (j = 1; j <= num; j++)
{
if (j == i)
edge[i][j] = 0;
else
edge[i][j] = -1;
}
}
for (i = 1; i <= num; i++)
{
vist[i] = 0;
minidis[i] = MAX;
}
} void dijkstra(int i)
{
int j, k;
int position = i; vist[position] = 1;
minidis[position] = 0; for (j = 1; j <= num - 1; j++)//一共要添加进num-1个点
{
for (k = 1; k <= num; k++)
{
if (vist[k] == 0 && edge[position][k] != -1 && minidis[position] + edge[position][k] < minidis[k])//新填入的点更新minidis
{
minidis[k] = minidis[position] + edge[position][k];
}
}
int min_value = MAX, min_pos;
for (k = 1; k <= num; k++)
{
if (vist[k] == 0 && minidis[k]<min_value)//比较出最小的那一个作为新添入的店
{
min_value = minidis[k];
min_pos = k;
}
}
vist[min_pos] = 1;
position = min_pos;
} } int main()
{
//freopen("i.txt", "r", stdin);
//freopen("o.txt", "w", stdout); int i,j,temp1,temp2,max_v;
while (scanf("%d", &num)!=EOF)
{
init();
for (i = 1; i <= num - 1; i++)
{
scanf("%d%d", &temp1, &temp2); edge[temp1][temp2] = 1;
edge[temp2][temp1] = 1;
}
dijkstra(1);
bool flag = true;
max_v=-1;
for (i = 2; i <= num ; i++)
{
max_v=max(max_v,minidis[i]);
}
for (i = 2; i <= num ; i++)
{
for (j = i + 1; j <= num; j++)
{
if (minidis[i] == minidis[j]&&minidis[i] != max_v)
flag = false;
}
}
if (flag)
cout << "YES" << endl;
else
cout << "NO" << endl;
}
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
HDU 5423:Rikka with Tree Dijkstra算法的更多相关文章
- hdu 5423 Rikka with Tree(dfs)bestcoder #53 div2 1002
题意: 输入一棵树,判断这棵树在以节点1为根节点时,是否是一棵特殊的树. 相关定义: 1. 定义f[A, i]为树A上节点i到节点1的距离,父节点与子节点之间的距离为1. 2. 对于树A与树B,如 ...
- hdu 5423 Rikka with Tree(dfs)
Problem Description As we know, Rikka is poor at math. Yuta is worrying about this situation, so he ...
- ACM: HDU 1874 畅通工程续-Dijkstra算法
HDU 1874 畅通工程续 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Desc ...
- HDU 1874 畅通工程续-- Dijkstra算法详解 单源点最短路问题
参考 此题Dijkstra算法,一次AC.这个算法时间复杂度O(n2)附上该算法的演示图(来自维基百科): 附上: 迪科斯彻算法分解(优酷) problem link -> HDU 1874 ...
- 畅通project续HDU杭电1874【dijkstra算法 || SPFA】
http://acm.hdu.edu.cn/showproblem.php?pid=1874 Problem Description 某省自从实行了非常多年的畅通project计划后.最终修建了非常多 ...
- (hdu)5423 Rikka with Tree (dfs)
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=5423 Problem Description As we know, Rikka is p ...
- HDU 5432 Rikka with Tree (BestCoder Round #53 (div.2))
http://acm.hdu.edu.cn/showproblem.php?pid=5423 题目大意:给你一个树 判断这棵树是否是独特的 一颗树是独特的条件:不存在一颗和它本身不同但相似的树 两颗树 ...
- hdu 1548 A strange lift (dijkstra算法)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1548 题目大意:升降电梯,先给出n层楼,然后给出起始的位置,即使输出从A楼道B楼的最短时间. 注意的几 ...
- Choose the best route HDU杭电2680【dijkstra算法 || SPFA】
http://acm.hdu.edu.cn/showproblem.php?pid=2680 Problem Description One day , Kiki wants to visit one ...
随机推荐
- fuseki远程访问方法
./fuseki-server启动服务后,我们的服务只能是localhost访问,无法被其他人访问,那么 要怎么修改呢.很简单,把apche-jena-fuseki-3.10.0/run 下面的shi ...
- 洛谷 P2375 [NOI2014]动物园
题目传送门 解题思路: 其实对于一个sum[i],其值就等于sum[next[i]] + sum[next[next[i]]] + ... + 1,然后我们可以记忆化,然后题目里又有一个限制,就是前后 ...
- define可变参数,float数据传输
define可变参数 一般在调试打印Debug信息的时候, 需要可变参数的宏. 从C99开始可以使编译器标准支持可变参数宏(variadic macros), 另外GCC也支持可变参数宏, 但是两种在 ...
- 【转载】UnityWebRequest的初步使用及常用方法解析
文章来源:https://blog.csdn.net/qwe25878/article/details/85051911#_35 今天,来学习一下Unity新的网络请求方式UnityWebReques ...
- 吴裕雄 Bootstrap 前端框架开发——Bootstrap 字体图标(Glyphicons):glyphicon glyphicon-plus
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...
- 吴裕雄 Bootstrap 前端框架开发——Bootstrap 字体图标(Glyphicons):glyphicon glyphicon-trash
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...
- NO12 useradd-passwd-uname-hostname命令-上传rz下载sz-批量部署- Linux用户相关操作
24 useradd #添加用户 语法:useradd 用户名 例子:ueradd oldboy .25 passwd #为用户设置或修改 ...
- mybatis关于级联查询结果集嵌套映射对象非列表的处理问题
工作中遇到这么一个问题,嵌套查询,返回json的时候,作为属性,deviceFields是一个device中的一个对象属性,在json返回的时候想要得到的应该是deviceFields:{ 具体属性} ...
- js排序专场
1,冒泡排序 function bubble(arr) { var len = arr.length - 1; for (let i = 0 ; i < len; i++) { var bool ...
- dango 常用 静态文件 中间件 admin管理 上传图片
静态文件 项目中的CSS.图片.js都是静态文件.一般会将静态文件放到一个单独的目录中,以方便管理.在html页面中调用时,也需要指定静态文件的路径,Django中提供了一种解析的方式配置静态文件路径 ...