hdoj 1869 六度分离
Lele对这个理论相当有兴趣,于是,他在HDU里对N个人展开了调查。他已经得到了他们之间的相识关系,现在就请你帮他验证一下“六度分离”是否成立吧。
对于每组测试,第一行包含两个整数N,M(0<N<100,0<M<200),分别代表HDU里的人数(这些人分别编成0~N-1号),以及他们之间的关系。
接下来有M行,每行两个整数A,B(0<=A,B<N)表示HDU里编号为A和编号B的人互相认识。
除了这M组关系,其他任意两人之间均不相识。
- #include <stdio.h>
- #define INF 0x3f3f3f3f
- #include <algorithm>
- using namespace std;
- int n, m;
- int dis[], vis[], cost[][];
//dis用来记录除此人外他是否与其他人认识,vis用来标记某人是否被访问过,cost用来记录两个人之间是否认识- int min(int x, int y)//求两个整数之间较小的数
- {
- return x < y ? x : y;
- }
- int cmp(int x, int y)//自定义降序排列
- {
- return x > y;
- }
- int dijkstra(int i)//利用dijkstra方法求两个人之间的距离,i为源点
- {
- int u, v, flag = ;
- for(u = ; u < n; u++)//将所有点到远点的距离设为无穷大
- {
- dis[u] = INF;
- vis[u] = ;//标记所有点都未访问
- }
- dis[i] = ;//源点到自身的距离为0
- while(true)
- {
- v = -;
- for(u = ; u < n; u++)
- if(!vis[u] && (v == - || dis[v] > dis[u]))//求未曾访问过且距离源点最近的人(即认识的人)
- v = u;
- if(v == -)//如果v=-1,表明无人认识源点或是所有的点都被访问过,就跳出循环
- break;
- vis[v] = ;//标记据源点最近的人
- for(u = ; u < n; u++)//更新权值,即各点到源点的距离
- dis[u] = min(dis[u], dis[v] + cost[v][u]);
- }
- sort(dis, dis+n, cmp);//对所有点到源点的距离进行降序排列
- if(dis[] > )//只要距离最大的距离大于7,即六度分离定理不成立
- flag = ;//用flag记录结果
- return flag;
- }
- int main()
- {
- int i, j;
- while(~scanf("%d%d", &n, &m))
- {
- int a, b;
- for(i = ; i < n; i++)//对cost进行初始化
- for(j = ; j < n; j++)
- cost[i][j] = INF;
- while(m--)
- {
- scanf("%d%d", &a, &b);
- cost[a][b] = cost[b][a] = ; //若两个人认识,则将两个人之间的距离设为1,否则为无穷大
- }
- for(i = ; i < n; i++)
- {
- if(!dijkstra(i))//求任意一个人到其他所有人的距离,只要有大于7的,就输出结果,跳出循环
- {
- printf("No\n");
- break;
- }
- }
- if(i == n)//如果i=n证明任何两个人之间的距离都不会超过7,输出Yes
- printf("Yes\n");
- }
- return ;
- }
spfa代码:
- #include <stdio.h>
- #include <string.h>
- #include <queue>
- # define INF 0x3f3f3f3f
- #define N 110
- #define M 450
- using namespace std;
- struct node
- {
- int from, to, val, next;
- };
- node edge[M];
- int n, m, cnt;
- int dis[N], vis[N], head[N];
- void add(int x, int y)
- {
- node e = {x, y, , head[x]};
- edge[cnt] = e;
- head[x] = cnt++;
- }
- void SPFA(int s)
- {
- queue<int>q;
- memset(vis, , sizeof(vis));
- memset(dis, INF, sizeof(dis));
- q.push(s);
- vis[s] = ;
- dis[s] = ;
- while(!q.empty())
- {
- int u = q.front();
- q.pop();
- vis[u] = ;
- for(int i = head[u]; i != -; i = edge[i].next)
- {
- int v = edge[i].to;
- if(dis[v] > dis[u] + edge[i].val)
- {
- dis[v] = dis[u] + edge[i].val;
- if(!vis[v])
- {
- vis[v] = ;
- q.push(v);
- }
- }
- }
- }
- }
- int main()
- {
- while(~scanf("%d%d", &n, &m))
- {
- cnt = ;
- int flag = ;
- memset(head, -, sizeof(head));
- while(m--)
- {
- int a, b;
- scanf("%d%d", &a, &b);
- add(a, b);
- add(b, a);
- }
- for(int i = ; i < n; i++)
- {
- SPFA(i);
- for(int j = ; j < n; j++)
- {
- if(dis[j] > )
- {
- flag = ;
- break;
- }
- }
- }
- if(flag)
- printf("Yes\n");
- else
- printf("No\n");
- }
- return ;
- }
floyd代码:
- #include <stdio.h>
- #define inf 0x3f3f3f3f
- int n, m, dis[][];
- void floyd()
- {
- int i, j, k;
- for(i = ; i < n; i++)
- for(j = ; j < n; j++)
- for(k = ; k < n; k++)
- {
- if(dis[j][k] > dis[j][i] + dis[i][k])
- dis[j][k] = dis[j][i] + dis[i][k];
- }
- }
- int main()
- {
- int i, j;
- while(~scanf("%d%d", &n, &m))
- {
- for(i = ; i < n; i++)
- for(j = ; j < n; j++)
- {
- if(i == j)
- dis[i][j] = ;
- else
- dis[i][j] = inf;
- }
- while(m--)
- {
- int a, b;
- scanf("%d%d", &a, &b);
- dis[a][b] = dis[b][a] = ;
- }
- floyd();
- int flag = ;
- for(i = ; i < n; i++)
- {
- for(j = ; j < n; j++)
- if(dis[i][j] > )
- {
- flag = ;
- break;
- }
- if(!flag)
- {
- printf("No\n");
- break;
- }
- }
- if(flag)
- printf("Yes\n");
- }
- return ;
- }
hdoj 1869 六度分离的更多相关文章
- hdoj 1869 六度分离【最短路径求两两边之间最长边】
六度分离 Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- ACM: HDU 1869 六度分离-Dijkstra算法
HDU 1869六度分离 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Descri ...
- hdu 1869 六度分离(最短路floyd)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1869 六度分离 Time Limit: 5000/1000 MS (Java/Others) M ...
- HDU 1869 六度分离
六度分离 http://acm.hdu.edu.cn/showproblem.php?pid=1869 Problem Description 1967年,美国著名的社会学家斯坦利·米尔格兰姆提出了一 ...
- HDU ACM 1869 六度分离(Floyd)
六度分离 Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- HDOJ 1869
#include<stdio.h> ][]; #define inf 0xffffff; void floyed(int n) { int i,j,k; ;k<n;k++) { ;i ...
- HDU 1869 六度分离 最短路
解题报告: 1967年,美国著名的社会学家斯坦利·米尔格兰姆提出了一个名为“小世界现象(small world phenomenon)”的著名假说,大意是说,任何2个素不相识的人中间最多只隔着6个人, ...
- HDU - 1869 六度分离 Floyd多源最短路
六度分离 1967年,美国著名的社会学家斯坦利·米尔格兰姆提出了一个名为“小世界现象(small world phenomenon)”的著名假说,大意是说,任何2个素不相识的人中间最多只隔着6个人,即 ...
- HDU 1869 六度分离【floyd】
题意:给出n个人,m个关系,问是否满足任意两个人之间的距离通过6个人就可以连接 用floyd就可以了,注意距离是大于7 #include<iostream> #include<cst ...
随机推荐
- Redis从基础命令到实战之散列类型(Hash)
从上一篇的实例中可以看出,用字符串类型存储对象有一些不足,在存储/读取时需要进行序列化/反序列化,即时只想修改一项内容,如价格,也必须修改整个键值.不仅增大开发的复杂度,也增加了不必要的性能开销. 一 ...
- easyui combobox点击输入框弹出下拉框
由于easyui combobox需要点击下拉箭头才能下拉,不能像select标签那样点击输入框就下拉,所以觉得不太方便,查看了一下,combobox弹出框是一个div,原本想在他的输入框的点击事件中 ...
- mssql2000 身份证号码验证
CREATE VIEW thisDate --返回当前日期,因为自定义函数中不能使用GETDATE() AS ),) AS aDate )) /*mssql2000 返回值=0,身份证校验正确 1:位 ...
- log4net 记录日志到sqlserver
参考:http://blog.csdn.net/niuyongjie/article/details/5777625 demo
- Begin :SWIFT 基本语法
国内介绍IOS书籍大多是很陈旧的代码, 2014年Apple发布了Swift语言, 毫无疑问Swift是一个强大的语言, 但是纵观国内的IOS现状,大家大多已经习惯了了OC, OC能解决的问题谁会想到 ...
- JQuery动画效果
jquery动画效果常用方法 1.show()显示效果语法:show(speed,callback)Number/String,Function speend为动画执行时间,单位为毫秒.也可以为slo ...
- map集合键值对存储,键值不重复,值可以重复
import java.util.HashMap; import java.util.Hashtable; import java.util.Iterator; import java.util.Li ...
- python第十九天-----Django进阶
1.机智的小django为我你们提供了快捷的表单验证! from django.shortcuts import render, HttpResponse,redirect from django i ...
- ANDROID调用webservice带soapheader验证
最近的一个项目中调用webservice接口,需要验证soapheader,现将解决方法记录如下:(网上资料出处太多,就不做引用,原作者如看到,如有必要添加请通知) 1.先看接口 POST /webs ...
- linux RPM、YUM
Linux 界的两大主流: RPM 与 DPKG distribution 代表 软件管理机制 使用指令 在线升级机制(指令) Red Hat/Fedora RPM rpm, rpmbuild YUM ...