六度分离 (dijkstra)
1967年,美国著名的社会学家斯坦利·米尔格兰姆提出了一个名为“小世界现象(small world phenomenon)”的著名假说,大意是说,任何2个素不相识的人中间最多只隔着6个人,即只用6个人就可以将他们联系在一起,因此他的理论也被称为“六度分离”理论(six degrees of separation)。虽然米尔格兰姆的理论屡屡应验,一直也有很多社会学家对其兴趣浓厚,但是在30多年的时间里,它从来就没有得到过严谨的证明,只是一种带有传奇色彩的假说而已。
Lele对这个理论相当有兴趣,于是,他在HDU里对N个人展开了调查。他已经得到了他们之间的相识关系,现在就请你帮他验证一下“六度分离”是否成立吧。
本题通过【Dijkstra求最短路 I】模板改得。
多次输入需要将 st 重置;
在建边的时候为无向图;
依次以每个点为起点(dist[x] = 0),判断从这个点开始到其他点的最短距离是否超过7(中间有6个人);
本题代码:
原题链接
#include <bits/stdc++.h>
using namespace std;const int N=1010;
const int INF=0x3f3f3f3f;
int g[N][N];//g[a][b]为a到b的距离
int dist[N];//每个点到1号点的最短距离
bool st[N];//判断每个点有没有更新过
int n,m;//n个点,m条边bool dijkstra(int x){memset(st,false,sizeof st);memset(dist,INF,sizeof(dist));//因为要找最小,所以每次把距离初始化成无穷大 dist[x]=0; //所有点到初始点的距离初始化成INF,第一个点初始化为0for(int i=1;i<=n-1;i++){//迭代n-1次,除第一个点外其余n-1个点 int t=-1;//还未开始遍历第一个点 for(int j=0;j<n;j++)//在没有更新的点中找距离起点最近的点 if(!st[j]&&(t==-1||dist[j]<dist[t]))//没有访问过或者开始第一个点 t=j; st[t]=true;for(int j=0;j<n;j++) dist[j]=min(dist[j],dist[t]+g[t][j]);//更新每一个点,判断之前最短距离与通过现在的t的距离谁更短 } for(int i=0;i<n;i++)if(dist[i] > 7) return false;return true;//cout<<dist[n]<<endl;
}int main(){while(cin>>n>>m){memset(g,INF,sizeof(g)); while(m--){int a,b,c;cin>>a>>b;//a到b点的距离为cg[a][b]=1;g[b][a]=1;} bool ans = true;for(int i=0;i<n;i++){if(!dijkstra(i)) ans = false;}if(ans) cout<<"Yes"<<endl;else cout<<"No"<<endl;}return 0;
}
【Dijkstra求最短路 I】模板代码:
模板链接
#include <bits/stdc++.h>
using namespace std;const int N = 1010;
const int INF = 0x3f3f3f3f;
int g[N][N];
int dist[N];
bool st[N];
int n,m;int dijkstra()
{memset(dist,INF,sizeof dist);dist[1] = 0;for(int i=1;i<=n-1;i++){//最短路径有n-1条边int t = -1;for(int j=1;j<=n;j++)//if(t == -1 || !st[j] && dist[j] < dist[t])if(!st[j] && (t==-1 || dist[j] < dist[t]))t = j;st[t] = true;for(int j=1;j<=n;j++){dist[j] = min(dist[j],dist[t]+g[t][j]);}}if(dist[n] == 0x3f3f3f3f) return -1;return dist[n];
}int main()
{cin>>n>>m;memset(g,INF,sizeof g);while(m--){int a,b,c;cin>>a>>b>>c;g[a][b] = min(g[a][b],c);}int ans = dijkstra();cout<<ans<<endl;return 0;
}
六度分离 (dijkstra)相关推荐
- HDU1869 六度分离【Dijkstra算法】
六度分离 Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...
- 六度分离(floyd算法,SPFA算法,最短路—Dijkstra算法)
Time Limit : 5000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) Total Submission(s) ...
- 图论专题HDU-1869 六度分离
六度分离(dijkstra算法或floyd算法) 题面 1967年,美国著名的社会学家斯坦利·米尔格兰姆提出了一个名为"小世界现象(small world phenomenon)" ...
- 六度分离 (无向图最短路径问题)
1967年,美国著名的社会学家斯坦利·米尔格兰姆提出了一个名为"小世界现象(small world phenomenon)"的著名假说,大意是说,任何2个素不相识的人中间最多只隔着 ...
- [C] Dijkstra算法——通过边实现松弛
Dijkstra算法--通过边实现松弛 本算法学习指定一个点(源点)到其余各个顶点的最短路径,也叫做单源最短路径例如求下图1号顶点到2,3,4,5,6号顶点的最短路径 这个时候你可能就要问了,为什么不 ...
- Codeforces.1051F.The Shortest Statement(最短路Dijkstra)
题目链接 先随便建一棵树. 如果两个点(u,v)不经过非树边,它们的dis可以直接算. 如果两个点经过非树边呢?即它们一定要经过该边的两个端点,可以直接用这两个点到 u,v 的最短路更新答案. 所以枚 ...
- 经典算法研究系列:二、Dijkstra 算法初探
经典算法研究系列:二.Dijkstra 算法初探 July 二零一一年一月 ====================== 本文主要参考:算法导论 第二版.维基百科. 写的不好之处,还望见谅. 本 ...
- 贪心算法单源点最短路径例题c语言源代码,Dijkstra算法是解单源最短路径问题的一个贪心算法...
问题描述 给定一个带权有向图 G=(V,E) ,其中每条边的权是一个非负实数. 另外,还给定 V 中的一个项点,称为源. 现在我们要计算从源到所有其他各项点的最短路径长度. 这里的长度是指路上各边权之 ...
- Acwing--朴素dijkstra
#include <iostream> #include <cstring> using namespace std;/* 优点:可以求得[n]到任一点的最短距离;可以输入最短 ...
最新文章
- struts2--国际化
- python—unittest—数据驱动详细讲解(ddt)
- VMP分析之VMP2.13插件化分析(四)
- EventStore文件存储设计
- SQL Server AlwaysOn 集群 关于主Server IP与Listener IP调换的详细测试
- 你会用Java实现两个大数相加吗
- 避坑!使用 Kubernetes 最易犯的 10 个错误
- 组合总和3 leetcode 216
- Kaggle实战之一回归问题
- VS“当前上下文中不存在名称“ViewBag”,当前上下文不存在名称“model””-已解决...
- ASP.NET MVC带来的变化
- kibana 查看有多少索引库_广州谷歌SEO优化外包一年多少钱
- 安卓变苹果12系统永久,安卓系统变苹果系统2020
- 区块链技术应用后,不再需要CA认证机构
- springBoot使用RestTemplate报错:No instance available for xxx.xxx.xxx.xxx
- 梦龙雪糕新代言人近日亮相,带来不止视觉与味蕾的欢愉享受!
- 华东理工大学pk华东师范大学计算机专业,华东理工大学朱为宏教授和华东师范大学杨海波教授合作在光控手性金属配位自组装体系的研究中取得突破性进展...
- RabbitMQ详解及其特性
- 小型仓库管理系统MySQL
- 使用Eclipse自带的工具检测和数据库连接时否成功