标签:
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1869
解题思路:
转化成最短路径问题,如果两人认识,把两者之间距离看成1 如果任意两人之间隔着7个人及其以上 (即距离>7) 则不满足六度分离
spfa:
#include<cstdio>
#include<cstring>
#include<queue>
#define INF 0x3f3f3f3f
#define MAXN 100+10//点数
#define MAXM 400+10//边数
using namespace std;
int n,m,top,vis[MAXN],dis[MAXN],head[MAXN];
struct node
{
int from,to,val,next;
};
node edge[MAXM];
void init()//初始化邻接表
{
top=0;//建表从零开始
memset(head,-1,sizeof(head));
}
void add(int u,int v,int w)//建立邻接表
{
// edge[top].from=u;
// edge[top].to=v;
// edge[top].val=w;
// edge[top].next=head[u];
// head[u]=top++;
node E={u,v,w,head[u]};
edge[top]=E;
head[u]=top++;
}
void spfa(int s)//s为源点
{
int i;
queue<int>q;//存储每次入队的点
memset(vis,0,sizeof(vis));
memset(dis,INF,sizeof(dis));//存储源点 到这个点的最短路
vis[s]=1;//表示这个点是否在队列里面
dis[s]=0;
q.push(s);
while(!q.empty())
{
int u=q.front();
q.pop();
vis[u]=0;//该点之后还可能进入队列 消除标记
for( i=head[u];i!=-1;i=edge[i].next)//遍历以u为起点的 所有边
{
int v=edge[i].to;
if(dis[v]>dis[u]+edge[i].val)
{
dis[v]=dis[u]+edge[i].val;
if(!vis[v])
{
q.push(v);
vis[v]=1;
}
}
}
}
}
void getmap()
{
int a,b;
while(m--)
{
scanf("%d%d",&a,&b);
add(a,b,1);
add(b,a,1);//无向图 既可由a->b,也可由b->a;
}
}
int main()
{
int i,j;
while(~scanf("%d%d",&n,&m))
{
init();
getmap();
int sign=1;
for(i=0;i<n;i++)
{
spfa(i);
for(j=0;j<n;j++)
{
if(dis[j]>7)
{
sign=0;
break;
}
}
if(!sign)
break;
}
if(sign)
printf("Yes\n");
else
printf("No\n");
}
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
hdoj-1869 六度分离【最短路径--dijkstra&&spfa&&floyd】
标签:
原文地址:http://blog.csdn.net/qq_29606781/article/details/47838823