杭电 1869 六度分离 (求每两个节点间的距离)

Description

1967年,美国著名的社会学家斯坦利·米尔格兰姆提出了一个名为“小世界现象(small world phenomenon)”的著名假说,大意是说,任何2个素不相识的人中间最多只隔着6个人,即只用6个人就可以将他们联系在一起,因此他的理论也被称为“六度分离”理论(six degrees of separation)。虽然米尔格兰姆的理论屡屡应验,一直也有很多社会学家对其兴趣浓厚,但是在30多年的时间里,它从来就没有得到过严谨的证明,只是一种带有传奇色彩的假说而已。

Lele对这个理论相当有兴趣,于是,他在HDU里对N个人展开了调查。他已经得到了他们之间的相识关系,现在就请你帮他验证一下“六度分离”是否成立吧。

Input

本题目包含多组测试,请处理到文件结束。 
对于每组测试,第一行包含两个整数N,M(0<N<100,0<M<200),分别代表HDU里的人数(这些人分别编成0~N-1号),以及他们之间的关系。 
接下来有M行,每行两个整数A,B(0<=A,B<N)表示HDU里编号为A和编号B的人互相认识。 
除了这M组关系,其他任意两人之间均不相识。

Output

对于每组测试,如果数据符合“六度分离”理论就在一行里输出"Yes",否则输出"No"。

Sample Input

8 7
0 1
1 2
2 3
3 4
4 5
5 6
6 7
8 8
0 1
1 2
2 3
3 4
4 5
5 6
6 7
7 0

Sample Output

Yes
Yes

最短路径模板链接

计算最短路径基本思想
  1. 定义数组map[i][j]元素为无穷大,当i == j时为0;
  2. 输入数据记录最小的map[i][j],map[i][j]为i到j的的距离
  3. 计算出每两个节点间的最小距离(或者始节点到每个节点的最小距离)(算法不同)
  4. 输出始节点到终节点距离
 1 #include<cstdio>
 2 #include<algorithm>
 3 #define INF 0xfffffff
 4 using namespace std;
 5 int map[1000][1000],n,m;
 6 void f1()
 7 {
 8     int k,i,j;
 9     for(k = 0 ; k < n ; k++)
10     {
11         for(i = 0 ; i < n ; i++)
12         {
13             for(j = 0 ; j < n ; j++)
14             {
15                 map[i][j]=min(map[i][j],map[i][k]+map[k][j]);
16             }
17         }
18     }
19 }
20 int main()
21 {
22     int i,j,a,b;
23     while(scanf("%d %d",&n,&m)!=EOF)
24     {
25         int flag=0;
26         for(i = 0 ; i < n ; i++)
27         {
28             for(j = 0 ; j < n ; j++)
29             {
30                 map[i][j]=(i == j)?0:INF;
31             }
32         }
33         for(i = 0 ; i < m ; i++)
34         {
35             scanf("%d %d",&a,&b);
36             map[a][b]=map[b][a]=1;
37         }
38         f1();
39         for(i = 0 ; i < n ; i++)
40         {
41             for(j = 0 ; j < n ; j++)
42             {
43                 if(map[i][j] > 7)
44                 {
45                     flag=1;
46                     break;
47                 }
48             }
49             if(flag)
50                 break;
51         }
52         if(flag)
53             printf("No\n");
54         else
55             printf("Yes\n");
56     }
57 }
时间: 2024-10-11 18:08:19

杭电 1869 六度分离 (求每两个节点间的距离)的相关文章

求树中两个节点的最低公共祖先

情形1:树是搜索二叉树 思路:从树的根节点开始遍历,如果根节点的值大于其中一个节点,小于另外一个节点,则根节点就是最低公共祖先.否则如果根节点的值小于两个节点的值,则递归求根节点的右子树,如果大于两个节点的值则递归求根的左子树.如果根节点正好是其中的一个节点,那么说明这两个节点在一条路径上,所以最低公共祖先则是根节点的父节点 public static BinaryTreeNode getLowestCommonAncestor(BinaryTreeNode rootParent,BinaryT

求二叉树中相差最大的两个节点间的差值绝对值

题目描述: 写一个函数,输入一个二叉树,树中每个节点存放了一个整数值,函数返回这棵二叉树中相差最大的两个节点间的差值绝对值.请注意程序效率. solution: int findMinMax(BTNode *T) { if(!T) return 0; int max = INT_MIN; int min = INT_MAX; stack<BTNode*> s; s.push(T); while (!s.empty()) { BTNode *tmp = s.top(); if(tmp->d

LeetCode | 1385. Find the Distance Value Between Two Arrays两个数组间的距离值【Python】

LeetCode 1385. Find the Distance Value Between Two Arrays两个数组间的距离值[Easy][Python][暴力] Problem LeetCode Given two integer arrays arr1 and arr2, and the integer d, return the distance value between the two arrays. The distance value is defined as the nu

C++算法之 求二叉树两个节点的最低公共节点

方法1:递归方法: (1)如果两个节点分别在根节点的左子树和右子树,则返回根节点 (2)如果两个节点都在左子树,则递归处理左子树:如果两个节点都在右子树,则递归处理右子树 bool FindNode(BTree* pRoot, BTree* pNode) { if (pRoot == NULL || pNode == NULL) { return false; } if (pRoot == pNode) { return true; } bool found = FindNode(pRoot->

六度分离 HDU杭电1869【dijkstra算法】

http://acm.hdu.edu.cn/showproblem.php?pid=1869 Problem Description 1967年,美国著名的社会学家斯坦利·米尔格兰姆提出了一个名为"小世界现象(small world phenomenon)"的著名假说,大意是说,任何2个素不相识的人中间最多只隔着6个人,即只用6个人就可以将他们联系在一起,因此他的理论也被称为"六度分离"理论(six degrees of separation).虽然米尔格兰姆的理论

HDU1007(求最近两个点之间的距离)

一年前学长讲这题的时候,没听懂,自己搜解题报告也看不懂,放了一年.如今对分治和递归把握的比一年前更加熟悉,这题也就解决了. 题意:给你一堆点让你求最近两点之间距离的一半,如果用暴力的话O(n*n)明显会超时,那么我们就用分治思想,将所有点按照横坐标x排序,然后取中间的mid,分着求1-mid,mid-n,这样递归求解,递归只需要logn级别就可以完成递归,这有点类似二分思想. 1.我们取左边点对最小和右边点对最小比较,取最小的,记做d 2:但是最近点有可能一个点在左边,一个点在右边,所以要单独考

求二叉树中两个节点的最远距离

问题定义 如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义"距离"为两节点之间边的个数.写一个程序求一棵二叉树中相距最远的两个节点之间的距离. 计算一个二叉树的最大距离有两个情况: 情况A: 路径经过左子树的最深节点,通过根节点,再到右子树的最深节点. 情况B: 路径不穿过根节点,而是左子树或右子树的最大距离路径,取其大者. 思路: 1,后序遍历每一节点,找出该节点到最右边的距离以及最左边的距离: 2,找到之和最大的即可. //需保存左子树中最长距离.右子树最长

dfs 无向图两节点间的所有路径

标题:风险度量 X星系的的防卫体系包含 n 个空间站.这 n 个空间站间有 m 条通信链路,构成通信网.两个空间站间可能直接通信,也可能通过其它空间站中转. 对于两个站点x和y (x != y), 如果能找到一个站点z,使得:当z被破坏后,x和y无法通信,则称z为关于x,y的关键站点. 显然,对于给定的两个站点,关于它们的关键点的个数越多,通信风险越大. 你的任务是:已知网络结构,求两站点之间的通信风险度,即:它们之间的关键点的个数. 输入数据第一行包含2个整数n(2 <= n <= 1000

【数学与物理】寻找两个位置间的更短路径

为何会说更短,而不是最短的呢!在探索的过程中, 总是可以找到更短的路径,在本文中,将讲述笔者的探索过程中粗略的描述. 两个位置间的距离,在自然环境中存在多条,而实际情况上,两个位置间的直线距离往往会成为首选.但是问题就出现在直线上,如何判断路径是条直线呢!在数学中,点线面,点连成线,线连成面,面连成立方.而立方连成会是什么呢!目前给它暂取为四维空间,在寻找两个位置间的最短路径中,发现四维空间存在的可能性,如果可以在自然界中证实它的存在,则比四维更高的维度将有可能挖出来.而它的意义在于,人类身处在