hdu 1869 六度分离-spfa

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#define MAX 0x3f3f3f
#define M 100000
using namespace std;


struct Edge
{
int from,to,val,next;
}edge[MAX];


queue<int> q;
int head[200];
int n,m;
int edgenum;
int vis[200];
int dist[200];


void addedge(int u,int v,int w)
{
Edge E={u,v,w,head[u]};
edge[edgenum]=E;
head[u]=edgenum++;
}


int spfa(int s)
{
int v,u,i;
memset(vis,0,sizeof(vis));
for(i=0;i<n;i++)
{
dist[i]=M;
}
dist[s]=0;
vis[s]=1;
q.push(s);
while(!q.empty())
{
u=q.front();
vis[u]=0;
q.pop();
for(i=head[u];i!=-1;i=edge[i].next)
{
v=edge[i].to;
if(dist[v]>dist[u]+edge[i].val)
{
dist[v]=dist[u]+edge[i].val;
if(!vis[v])
{
q.push(v);
vis[v]=1;
}
}
}
}
for(i=0;i<n;i++)
{
if(dist[i]>7)
{
return false;
}
}
return true;
}


int main()
{
int i;
int a,b,c;
while(scanf("%d%d",&n,&m)!=EOF)
{
memset(head,-1,sizeof(head));
edgenum=0;
for(i=0;i<m;i++)
{
scanf("%d%d",&a,&b);
c=1;
addedge(a,b,c);
addedge(b,a,c);
}
/*
首先我们要知道spfa的用法,在现在的我看来,我觉得spfa是用来求起始点到各个点的距离的,代码当中的
dist[200]就是用来保存这个距离的,这个题目只是多进行了一次循环,从原来的1个点改到现在的n个点 。
我们可以这样理解,比如我们先假设起始点为0,那么我们接下来就需要更新出点0到0-n-1个点的距离,并保存在
dist[200]当中,题目当中又说每两个人之间的间隔人数不能多于6个人,那么就可以转化为:
for(i=0;i<n;i++)
if(dist[i]>7)
用这个循环来判断点0到各个点的距离是否大于7,不要以为是6,可以画个图,然后你就会明白了
*/
for(i=0;i<n;i++)
{
if(!spfa(i))
{
printf("No\n");
break;
}
}
if(i==n)
printf("Yes\n");
}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值