hdu1869六度分离,spfa实现求最短路

时间:2023-12-23 10:27:44

就是给一个图。假设随意两点之间的距离都不超过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");}
}