`
暴风雪
  • 浏览: 388954 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
社区版块
存档分类
最新评论

[spfa]hdoj 4460:Friend Chains

阅读更多

大致题意:

    一个无向图n个点,m条边,求任意两个点之间最短路的最大值。

 

大致思路:

    比赛时以为要有什么牛逼的算法才能做出这道题。后来算了下效率,发现用spfa求出n个点的最短路就可以了。

 

#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstring>
using namespace std;
const int nMax=1050;
const int mMax=30050;
const int inf=1<<28;

class nodea{
public:
    int id;
    nodea *p[26];
    nodea(){
        int i;
        id=-1;
        for(i=0;i<26;i++)p[i]=NULL;
    }
};

nodea *root;
int cnt;

int insert(char *s){
    int i;
    nodea *r=root;
    int l=strlen(s);
    for(i=0;i<l;i++){
        if(r->p[s[i]-'A']==NULL){
            r->p[s[i]-'A']=new nodea();
        }
        r=r->p[s[i]-'A'];
    }
    if(r->id==-1){
        r->id=cnt;
        cnt++;
    }
    return r->id;
}

struct{
    int u,v, next;
    int  w;
}edge[mMax];
int n, k, head[nMax];
int dis[nMax];
int que[nMax],m,sum[nMax];
bool vis[nMax];

void addedge(int a,int b,int w){
    edge[k].w = w;
    edge[k].u=a;
    edge[k].v=b;
    edge[k].next=head[a];
    head[a]=k;k++;
}

void spfa(int s){
    int i, hhead = 0, tail = 1;
    for(i = 1; i <= n; i ++){
        dis[i] = inf;////////////
        vis[i] = false;
    }
    dis[s] = 0;
    que[0] = s;
    vis[s] = true;
    while(hhead != tail){
        int u = que[hhead];
        vis[u] = false;
        for(i=head[u];i!=0;i=edge[i].next){
            int v = edge[i].v;
            if(dis[v] >dis[u] + edge[i].w){////////
                dis[v] = dis[u] + edge[i].w;
                if(!vis[v]){
                    vis[v] = true;
                    que[tail ++] = v;
                    if(tail == nMax) tail = 0;
                }
            }
        }
        hhead++;
        if(hhead ==nMax) hhead = 1;
    }
}

char str[50],str1[50];
int main(){
    int i,j,m,a,b,c;
    while(cin>>n&&n)
    {
        k=1;
        cnt=1;
        root=new nodea();
        memset(head,0,sizeof(head));
        for(i=0;i<n;i++)
        {
            scanf("%s",str);
        }
        cin>>m;
        while(m--)
        {
            scanf("%s%s",str,str1);
            a=insert(str);
            b=insert(str1);
            addedge(a,b,1);
            addedge(b,a,1);
        }
        int ans=0;
        for(i=1;i<=n;i++)
        {
            spfa(i);
            for(j=1;j<=n;j++)
            {
                ans=max(ans,dis[j]);
            }
        }
        if(ans==inf)ans=-1;
        cout<<ans<<endl;
    }
    return 0;
}
 
0
3
分享到:
评论

相关推荐

    SPFA[知乎:叶枝黎曼].py

    SPFA[知乎:叶枝黎曼].py

    SPFA.zip_SPFA

    标题中的"SPFA.zip_SPFA"表明这是一个与SPFA算法相关的压缩文件,SPFA全称为Shortest Path Faster Algorithm,即最短路径更快算法。这是一种解决图论中的单源最短路径问题的算法,通常用于有向图。描述提到SPFA算法...

    SPFA算法模板

    ### SPFA算法详解 #### 一、算法简介 SPFA(Shortest Path Faster Algorithm)算法是一种高效的单源最短路径算法。它由西南交通大学的段凡丁教授在1994年提出。与传统的最短路径算法如Dijkstra算法相比,SPFA在...

    SPFA.rar_SPFA_最短路径

    SPFA(Shortest Path Faster Algorithm)是最短路径算法的一种,主要应用于图论和网络流问题中,用于寻找从源节点到图中所有其他节点的最短路径。SPFA算法是Bellman-Ford算法的一种优化版本,它在处理负权边的情况下...

    SPFA算法优化及应用

    "SPFA算法优化及应用" SPFA(Shortest Path Faster Algorithm)是一种高效的单源最短路算法,广泛应用于图论和动态规划等领域。下面是对SPFA算法的详细介绍和优化。 基本实现 SPFA算法的基本思想是通过relax操作...

    spfa.rar_SPFA_visual c_求最短路径

    **SPFA(Shortest Path Faster Algorithm)是最短路径算法的一种,它是Bellman-Ford算法的优化版本。在图论和计算机科学中,这类算法主要用于解决网络流问题,例如计算两个节点之间的最短路径。本代码示例是用C++...

    SPFA算法.doc

    SPFA(Shortest Path Faster Algorithm)算法是一种用于解决图论中的单源最短路径问题的算法,它是贝尔曼-福特(Bellman-Ford)算法的一种优化版本,主要应用于求解带有负权重边的图的最短路径。SPFA通过使用队列...

    求单源点最短路径效率很高的spfa算法

    **SPFA算法详解** SPFA(Shortest Path Faster Algorithm)是一种用于解决图论中的单源最短路径问题的算法,由姚一兆提出。相比于Dijkstra算法,SPFA在处理某些稠密图时表现出更高的效率,尽管它不是一种确定性的...

    最短路径 之 SPFA算法

    SPFA最短路径算法 SPFA(Shortest Path Faster Algorithm)是一种单源最短路径算法,它的性能非常好,代码实现也并不复杂。特别是当图的规模大,用邻接矩阵存不下的时候,用 SPFA 则可以很方便地面对临接表。每个...

    spfa算法的java实现

    SPFA(Shortest Path Faster Algorithm)算法是一种求解图中单源最短路径问题的算法,它是Bellman-Ford算法的一种优化版本。在Java中实现SPFA算法,我们需要理解其核心思想并熟悉Java编程语法。 SPFA算法的主要优点...

    SPFA.rar_SPFA

    **SPFA算法详解** SPFA(Shortest Path Faster Algorithm,最短路径更快算法)是一种用于解决图论中的单源最短路径问题的算法,由美国伊利诺伊大学香槟分校的王浩教授提出。与Dijkstra算法不同,SPFA算法在某些情况...

    SPFA.cpp SPFA算法

    最短路SPFA算法。SPFA(Shortest Path Faster Algorithm)算法是求单源最短路径的一种算法,它是Bellman-ford的队列优化,它是一种十分高效的最短路算法。存在负权边时使用。

    spfa.cpp 算法spfa的板子

    自己打的spfa算法板子。包含邻接表的两种形式,邻接矩阵Map;此代码不完全,(使用是要注释掉部分的)在使用时要结合题意更改。望采纳!

    spfa.rar_SPFA

    **SPFA算法详解** SPFA(Shortest Path Faster Algorithm)是一种用于解决图论中的单源最短路径问题的算法,由姚新在2001年提出。它是一种改进的Bellman-Ford算法,旨在提高求解效率。与Bellman-Ford算法每次迭代...

    最短路SPFA

    ### 最短路径算法SPFA详解 SPFA(Shortest Path Faster Algorithm)是一种基于Bellman-Ford算法改进的求解单源最短路径问题的算法,它利用队列来加速搜索过程,尤其适用于含有大量负权边但不存在负权回路的情况。在...

Global site tag (gtag.js) - Google Analytics