HDU 5423:Rikka with Tree Dijkstra算法

Rikka with Tree

Accepts: 207

Submissions: 815

Time Limit: 2000/1000 MS (Java/Others)

Memory Limit: 65536/65536 K (Java/Others)

问题描述

众所周知,萌萌哒六花不擅长数学,所以勇太给了她一些数学问题做练习,其中有一道是这样的:

对于一棵树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

Hint

对于第二组数据下面这棵树和它相似。
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;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-13 03:58:42

HDU 5423:Rikka with Tree Dijkstra算法的相关文章

hdu 5423 Rikka with Tree 树的性质

Rikka with Tree Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 165    Accepted Submission(s): 85 Problem Description As we know, Rikka is poor at math. Yuta is worrying about this situation, s

HDU 5423 Rikka with Tree(水题)

Rikka with Tree Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 292    Accepted Submission(s): 149 Problem Description As we know, Rikka is poor at math. Yuta is worrying about this situation,

hdu 5423 Rikka with Tree(dfs)

Problem Description As we know, Rikka is poor at math. Yuta is worrying about this situation, so he gives Rikka some math tasks to practice. There is one of them: For a tree T, let F(T,i) be the distance between vertice 1 and vertice i.(The length of

hdu 5423 Rikka with Tree(dfs)bestcoder #53 div2 1002

题意: 输入一棵树,判断这棵树在以节点1为根节点时,是否是一棵特殊的树. 相关定义: 1.  定义f[A, i]为树A上节点i到节点1的距离,父节点与子节点之间的距离为1. 2.  对于树A与树B,如果A与B的节点数相同,且无论i为何值,f[A, i]与f[B, i]都相等,则A与B为两棵相似的树. 3.  对于一棵树A,在以节点1为根节点的情况下,如果不存在与其它树与A相似,则A是一棵特殊的树. 输入: 包含多组输入样例. 每组输入样例中首先输入一个整数n,表示一棵含有n个节点的树. 接下来n

hdu 5425 Rikka with Tree II(暴力)

题目链接:hdu 5425 Rikka with Tree II 直接枚举就好了,当概率极小时贡献值可以忽略. #include <cstdio> #include <cstring> #include <cmath> #include <vector> #include <queue> #include <algorithm> using namespace std; const int maxn = 1e5 + 5; int N,

hdu 1548 A strange lift (dijkstra算法)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1548 题目大意:升降电梯,先给出n层楼,然后给出起始的位置,即使输出从A楼道B楼的最短时间. 注意的几点 (1)每次按一下,只能表示上或者是下,然后根据输入的看是上几层或者是下几层. (2)注意不能到底不存在的楼层. 详见代码. 1 #include <iostream> 2 #include <cstdio> 3 using namespace std; 4 const int IN

畅通project续HDU杭电1874【dijkstra算法 || SPFA】

http://acm.hdu.edu.cn/showproblem.php?pid=1874 Problem Description 某省自从实行了非常多年的畅通project计划后.最终修建了非常多路.只是路多了也不好,每次要从一个城镇到还有一个城镇时,都有很多种道路方案能够选择,而某些方案要比还有一些方案行走的距离要短非常多.这让行人非常困扰. 如今,已知起点和终点,请你计算出要从起点到终点.最短须要行走多少距离. Input 本题目包括多组数据.请处理到文件结束. 每组数据第一行包括两个正

ACM: HDU 1874 畅通工程续-Dijkstra算法

HDU 1874 畅通工程续 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Description 某省自从实行了很多年的畅通工程计划后,终于修建了很多路.不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择,而某些方案要比另一些方案行走的距离要短很多.这让行人很困扰. 现在,已知起点和终点,请你计算出要从起点到终点,最短需要行走多少距离. Input 本题目包含多

hdu 2544 最短路 (dijkstra算法)

最短路 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 34855    Accepted Submission(s): 15096 Problem Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找