就是给一个图。假设随意两点之间的距离都不超过7则输出Yes,否则



输出No。

因为之前没写过spfa,无聊的试了一下。



大概说下我对spfa实现的理解。



因为它是bellmanford的优化。

所以之前会bf的理解起来,可能会比較easy。



它是这样子的,你弄一个队列。



先打一个起点进去。之后求出的到各点的最短路。



都是由这个点出发的。

然后開始迭代,直至队列为空。



在迭代的过程中,



首先从队列里面拿一个点出来,



然后标记一下,说明这个点不在队列里面。



然后開始枚举全部点。进行松弛化,



松弛化的过程就是看以这个拿出来的点为转折点,



枚举的其他点为终点,看有没有更好的方法



让路径变短。



假设有的话,推断那个点在不在队列中。



假设不在。



就把枚举出的那个点。拿到



队列中去。记得标记一下说明这个点已经在队列中了。

就是这样了。



代码例如以下:

#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
int num_dot,num_side,iq[110],weight[110],dis[110][110];
void init()
{
int i,t1,t2;
memset(dis,127,sizeof(dis));
for(i=0;i<num_side;i++)
{
scanf("%d%d",&t1,&t2);
dis[t1][t2]=1;
dis[t2][t1]=1;
}
}
void spfa(int st)
{
int x,i;
queue<int>qq;
memset(iq,0,sizeof(iq));
memset(weight,127,sizeof(weight));
iq[st]=1;
qq.push(st);
weight[st]=0;
while(qq.size())
{
x=qq.front();
qq.pop();
iq[x]=0;
for(i=0;i<num_dot;i++)
if(weight[i]>weight[x]+dis[x][i])
{
weight[i]=weight[x]+dis[x][i];
if(!iq[i])
{
qq.push(i);
iq[i]=1;
}
}
}
}
bool isright()
{
int i,j;
for(i=0;i<num_dot;i++)
{
spfa(i);
for(j=i+1;j<num_dot;j++)
if(weight[j]>7)
return 0;
}
return 1;
}
int main()
{
while(scanf("%d%d",&num_dot,&num_side)!=EOF)
{init();
if(isright())
printf("Yes\n");
else
printf("No\n");}
}

hdu1869六度分离,spfa实现求最短路的更多相关文章

  1. 基于bellman-ford算法使用队列优化的spfa求最短路O(m),最坏O(n*m)

    acwing851-spfa求最短路 #include<iostream> #include<cstring> #include<algorithm> #inclu ...

  2. ACM - 最短路 - AcWing 851 spfa求最短路

    AcWing 851 spfa求最短路 题解 以此题为例介绍一下图论中的最短路算法 \(Bellman\)-\(Ford\) 算法.算法的步骤和正确性证明参考文章最短路径(Bellman-Ford算法 ...

  3. spfa求次短路

    思路:先算出每个点到1的最短路d1[i],记录下路径,然后枚举最短路上的边 删掉之后再求一遍最短路,那么这时的最短路就可能是答案. 但是这个做法是错误的,可以被卡掉. 比如根据下面的例题生成的一个数据 ...

  4. HDU 1688 Sightseeing&HDU 3191 How Many Paths Are There(Dijkstra变形求次短路条数)

    Sightseeing Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...

  5. COJ 0579 4020求次短路的长度

    4020求次短路的长度 难度级别:C: 运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 在一个地图上共有N个路口(编号分别为1到N),R条道路( ...

  6. spfa 单源最短路究极算法

    学习博客链接:SPFA 求单源最短路的SPFA算法的全称是:Shortest Path Faster Algorithm.     SPFA算法是西南交通大学段凡丁于1994年发表的.    从名字我 ...

  7. hdu 3760(2次bfs求最短路)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3760 思路:首先是建反图,从点n开始做spfa求出n到各点的最短路,然后从1点开始搜最小序列,对于边( ...

  8. 关于dijkstra求最短路(模板)

    嗯....   dijkstra是求最短路的一种算法(废话,思维含量较低,   并且时间复杂度较为稳定,为O(n^2),   但是注意:!!!!         不能处理边权为负的情况(但SPFA可以 ...

  9. 分层图 (可以选择K条路的权为0,求最短路)

    分层图可以处理从图中选取k条边使其边权变为0,求最短路 Description 在你的强力援助下,PCY 成功完成了之前的所有任务,他觉得,现在正是出去浪的大好时光.于是,他来到高速公路上,找到一辆摩 ...

随机推荐

  1. Hongwei Xi

    Hongwei Xi Hongwei Xi Hongwei Xi's Curriculum Vita Hongwei Xi

  2. Android编程心得-Handler与子线程的交互初步

    在编写项目的时候,本人发现一个关于线程与Handler很容易犯的错误. 我有两个Activity,一个Activity在后台创建了一个线程并且启动,这个线程对象对应的实体实在另外一个Activity的 ...

  3. Hangfire Highlighter Tutorial

    Hangfire Highlighter Tutorial Hangfire是一个开源且商业免费使用的工具函数库.可以让你非常容易地在ASP.NET应用(也可以不在ASP.NET应用)中执行多种类型的 ...

  4. Android studio导入第三方类库

    1.开发过程中想要导入第三方类库和Eclipse也是有差别的,我们导入SlidingMenu这个类库,从github上下载下来解压到项目目录下. 2.然后我们重启我们的android studio就会 ...

  5. RSA密码系统 基于大数环境编写 密码学课程设计

    RSA密码系统的实现 1.问题描述 RSA密码系统可具体描述为:取两个大素数p和q,令n=pq,N=(p-1)(q-1),随机选择整数d,满足gcd(d,N)=1,ed=1 modN. 公开密钥:k1 ...

  6. C++环形矩阵填充实现

    #include<iostream> #include<iomanip> #include<cstdlib> #include<ctime> #incl ...

  7. Objective-c 算术函数和常量代表

    不变 常量名 说明 M_PI 圆周率(=π) M_PI_2 圆周率的1/2(=π/2) M_PI_4 圆周率的1/4(=π/4) M_1_PI =1/π M_2_PI =2/π M_E =e M_LO ...

  8. vc 基于对话框多线程编程实例——线程之间的通信

     vc基于对话框多线程编程实例——线程之间的通信 实例:

  9. android用于打开各种文件的intent

    import android.app.Activity; import android.content.Intent; import android.net.Uri; import android.n ...

  10. Web工程师的工具箱 | 酷壳 - CoolShell.cn

    Web工程师的工具箱 | 酷壳 - CoolShell.cn Web工程师的工具箱 2012年12月19日 陈皓 发表评论 阅读评论 30,168 人阅读     本文出自Ivan Zuzak 的&l ...