2013成都邀请赛J称号||HDU4725 The Shortest Path in Nya Graph(spfa+slf最短的优化)

2013成都邀请赛J称号||HDU4725 The Shortest Path in Nya Graph(spfa+slf最短的优化)

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

职务地址:HDU 4725

这题卡了好长时间了,建图倒是会建,可是不会最短路的算法优化,本以为都须要堆去优化的,打算学了堆之后再来优化。可是昨晚CF的一道题。。(那题也是不优化过不了。。)然后我就知道了还有不须要堆也能够的优化。并且优化的操作非常easy,把单向队列变成双端队列即可了。详细优化思路是若d[v]比队列前端的元素的距离小,就增加队列前端,否则增加队列尾端。

非常easy吧。

。。会了后。把这题一加上slf优化就过了。

。。

事实上这题的重点在于建图。。不在于优化。。。。sad。。

这题的建图就是把层次也都抽象成两个点。一个用来出,一个用来进。我是看的kuangbin大神的博客才知道的。

详情见kuangbin大神博客。。kuangbin大神博客

懒得去的能够看以下博文文字的复制。。

N个点,然后有N层。要假如2*N个点。

总共是3*N个点。

点1~N就是相应的实际的点1~N. 要求的就是1到N的最短路。

然后点N+1 ~ 3*N 是N层拆出出来的点。

第i层,入边到N+2*i-1, 出边从N+2*i 出来。

(1<= i <= N)

N + 2*i 到 N + 2*(i+1)-1 加边长度为C. 表示从第i层到第j层。

N + 2*(i+1) 到 N + 2*i – 1 加边长度为C,表示第i+1层到第j层。

假设点i属于第u层,那么加边 i -> N + 2*u -1 N + 2*u ->i 长度都为0

然后我的代码例如以下:

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <ctype.h>
#include <queue>
#include <map>
#include <algorithm>

using namespace std;
const int INF=0x3f3f3f3f;
int vis[310000], d[310000], cnt, head[310000], n, num;
struct node
{
    int u, v, w, next;
} edge[700000];
void add(int u, int v, int w)
{
    edge[cnt].v=v;
    edge[cnt].w=w;
    edge[cnt].next=head[u];
    head[u]=cnt++;
}
void spfa()
{
    int f1=0, f2=0, i;
    deque<int>q;
    q.push_back(1);
    memset(d,INF,sizeof(d));
    memset(vis,0,sizeof(vis));
    d[1]=0;
    vis[1]=1;
    while(!q.empty())
    {
        int u=q.front();
        q.pop_front();
        vis[u]=0;
        for(i=head[u]; i!=-1; i=edge[i].next)
        {
            int v=edge[i].v;
            if(d[v]>d[u]+edge[i].w)
            {
                d[v]=d[u]+edge[i].w;
                if(!vis[v])
                {
                    vis[v]=1;
                    if(!q.empty()&&d[v]<d[q.front()])
                    {
                        q.push_front(v);
                    }
                    else
                        q.push_back(v);
                }
            }
        }
    }
    if(d[n]==INF)
        d[n]=-1;
    printf("Case #%d: %d\n",num,d[n]);
}
int main()
{
    int t, u, v, w, m, c, i;
    num=0;
    scanf("%d",&t);
    while(t--)
    {
        num++;
        memset(head,-1,sizeof(head));
        memset(vis,0,sizeof(vis));
        cnt=0;
        scanf("%d%d%d",&n,&m,&c);
        for(i=1; i<=n; i++) //将第i个边与该边所属的层次u相连。
        {
            scanf("%d",&u);
            add(i,n+2*u-1,0);
            add(n+2*u,i,0);
        }
        for(i=1; i<n; i++) //将每两个相邻的层次互连
        {
            add(n+2*i+1,n+2*i,c);
            add(n+2*i-1,n+2*i+2,c);
        }
        while(m--)
        {
            scanf("%d%d%d",&u,&v,&w);
            add(u,v,w);
            add(v,u,w);
        }
        spfa();
    }
    return 0;
}

版权声明:本文博客原创文章。博客,未经同意,不得转载。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/117554.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 常见的SQL笔试题和面试题(上):经典50题

    常见的SQL笔试题和面试题(上):经典50题https://zhuanlan.zhihu.com/p/38354000常见的SQL笔试题和面试题(上):经典50题已知有如下4张表:学生表:STUDENT(S#,SNAME,SAGE,SSEX)课程表:COURSE(C#,CNAME,T#)成绩表:SC(S#,C#,SCORE)教师表:TEACHER(T#,TNAME)其中,1)学生表里的字段含义:S#代表学号,SNAME代表学生姓名,SAGE…

    2022年6月28日
    23
  • input file获取文件路径

    input file获取文件路径html代码段:<inputtype=”file”@change.prevent.stop=”upload”>vue中script代码段:data(){fileName:”},methods:{upload(event){letfiles=event.target.files[0];th…

    2022年7月25日
    132
  • 创建eureka注册中心_微服务注册中心和网关

    创建eureka注册中心_微服务注册中心和网关目录关于SpringCloud版本单机模式Eureka注册中心搭建引入Eureka-Server依赖创建启动类添加配置高可用Eureka注册中心搭建双节点注册中心修改配置文件修改hosts文件启动测试多节点注册中心修改配置文件启动测试常见问题参考文章SpringCloud是一系列框架的集合,它利用SpringBoot的开发便利性巧…

    2022年8月21日
    3
  • idea进入方法快捷键详情大全(idea快捷键大全最新设置)[通俗易懂]

    idea进入方法快捷键详情大全(idea快捷键大全最新设置)[通俗易懂]首页>软件应用>返回首页idea进入方法快捷键详情大全(idea快捷键大全最新设置)软件应用发布时间:2022-02-1311:05:09刚开始使用IDEA时一直都不熟悉,利用空闲的时间整理了一下常用的IDEA快捷键。1、Ctrl快捷键介绍Ctrl+F在当前文件进行文本查找Ctrl+R在当前文件进行文本替换Ctrl+Z撤销Ctrl+Y删除光标所在行或删除选中的行Ctrl+X剪切光标所在行或剪切选择内容…

    2022年10月2日
    0
  • 基尼系数计算方法_西南财经大学基尼系数

    基尼系数计算方法_西南财经大学基尼系数上图图片来自维基百科·自由的百科全书最近在尝试做一些流量调控的事情,流量对于任何商业系统都是宝贵的资源,不能任由他人无限制获取,且需要通过一定手段加以调控,以期用户体验、平台生态、平台利益多方最大化。这个目标是宏大而美好的,但总要一步步慢慢来。先说如何平衡生态问题(当然指的是B端用户),生态问题就像国民收入均衡问题一样,常用的就是基尼系数,维基百科的中文链接要FQ才能打开,好伤心,英文的我…

    2022年10月13日
    0
  • zookeeper的基本操作_奇门遁甲实战入门之五

    zookeeper的基本操作_奇门遁甲实战入门之五本原创入门教程,涵盖ZooKeeper核心内容,通过实例和大量图表,结合实战,帮助学习者理解和运用,任何问题欢迎留言。目录:zookeeper介绍与核心概念 安装和使用 ZooKeeper分布式锁实现 ZooKeeper框架Curator分布式锁实现及源代码分析 zookeeper开发实战(java客户端)本章是后续学习的基石,只有充分理解了分布式系统的概念和面临的问题,以及Z…

    2022年10月7日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号