hdoj-1869 六度分离【最短路径--dijkstra&&spfa&&floyd】

题目: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;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-27 11:37:36

hdoj-1869 六度分离【最短路径--dijkstra&&spfa&&floyd】的相关文章

hdu 1869 六度分离(最短路floyd)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1869 六度分离 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 5171    Accepted Submission(s): 2089 Problem Description 1967年,美国著名的社会学家斯坦利·米尔格兰姆提出了一个名为“

hdoj 1869 六度分离【最短路径求两两边之间最长边】

六度分离 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 5443    Accepted Submission(s): 2208 Problem Description 1967年,美国著名的社会学家斯坦利·米尔格兰姆提出了一个名为“小世界现象(small world phenomenon)”的著名假说,大意是说,任何2个素不相识的人中

hdoj 1869 六度分离【最短路的3种写法】

六度分离 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 6382    Accepted Submission(s): 2581 Problem Description 1967年,美国著名的社会学家斯坦利·米尔格兰姆提出了一个名为"小世界现象(small world phenomenon)"的著名假说,大意是说,任何2个素

几个小模板:topology, dijkstra, spfa, floyd, kruskal, prim

1.topology: 1 #include <fstream> 2 #include <iostream> 3 #include <algorithm> 4 #include <cstdio> 5 #include <cstring> 6 #include <cmath> 7 #include <cstdlib> 8 9 using namespace std; 10 11 #define EPS 1e-6 12 #de

(最短路径算法整理)dijkstra、floyd、bellman-ford、spfa算法模板的整理与介绍

这一篇博客以一些OJ上的题目为载体.整理一下最短路径算法.会陆续的更新... 一.多源最短路算法--floyd算法 floyd算法主要用于求随意两点间的最短路径.也成最短最短路径问题. 核心代码: /** *floyd算法 */ void floyd() { int i, j, k; for (k = 1; k <= n; ++k) {//遍历全部的中间点 for (i = 1; i <= n; ++i) {//遍历全部的起点 for (j = 1; j <= n; ++j) {//遍历

四大算法解决最短路径问题(Dijkstra+Bellman-ford+SPFA+Floyd)

什么是最短路径问题? 简单来讲,就是用于计算一个节点到其他所有节点的最短路径. 单源最短路算法:已知起点,求到达其他点的最短路径. 常用算法:Dijkstra算法.Bellman-ford算法.SPFA算法 多源最短路算法:求任意两点之间的最短路径. 常用算法:floyd算法 单源最短路径——Dijkstra Dijkstra算法是经典的最短路径算法,用于计算一个节点到其他所有节点的最短路径. 主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止. 时间复杂度:O(n^2) 处理问题:单源.

最短路知识点总结(Dijkstra,Floyd,SPFA,Bellman-Ford)

Dijkstra算法: 解决的问题: 带权重的有向图上单源最短路径问题.且权重都为非负值.如果采用的实现方法合适,Dijkstra运行时间要低于Bellman-Ford算法. 思路: 如果存在一条从i到j的最短路径(Vi.....Vk,Vj),Vk是Vj前面的一顶点.那么(Vi...Vk)也必定是从i到k的最短路径.为了求出最短路径,Dijkstra就提出了以最短路径长度递增,逐次生成最短路径的算法.譬如对于源顶点V0,首先选择其直接相邻的顶点中长度最短的顶点Vi,那么当前已知可得从V0到达Vj

最短路算法 :Bellman-ford算法 &amp; Dijkstra算法 &amp; floyd算法 &amp; SPFA算法 详解

 本人QQ :2319411771   邮箱 : [email protected] 若您发现本文有什么错误,请联系我,我会及时改正的,谢谢您的合作! 本文为原创文章,转载请注明出处 本文链接   :http://www.cnblogs.com/Yan-C/p/3916281.html . 很早就想写一下最短路的总结了,但是一直懒,就没有写,这几天又在看最短路,岁没什么长进,但还是加深了点理解. 于是就想写一个大点的总结,要写一个全的. 在本文中因为邻接表在比赛中不如前向星好写,而且前向星效率并

最短路(Dijkstra,Floyd,Bellman_Ford,SPFA)

当然,这篇文章是借鉴大佬的... 最短路算法大约来说就是有4种——Dijkstra,Floyd,Bellman_Ford,SPFA 接下来,就可以一一看一下... 1.Dijkstra(权值非负,适用于有向图及无向图,单源最短路) 1 Dijkstra's算法解决的是图中单个源点到其它顶点的最短路径.只能解决权值非负(看了代码就知道了)2 Dijkstral只能求出任意点到达源点的最短距离(不能求出任意两点之间的最短距离),同时适用于有向图和无向图,复杂度为O(n^2).3算法的过程: 1设置顶