【CCF】行车路线 改编Dijkstra

【AC】

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>

using namespace std;
typedef long long ll;
const int inf=0x3f3f3f3f;
const int maxn=5e2+2;
const int maxm=1e5+2;
int n,m;
struct edge{
    int t;
    int to;
    int nxt;
    ll w;
}e[2*maxm];
struct node{
    int id;
    ll d;
    ll fa;
    node(int _id,ll _d,ll _fa):id(_id),d(_d),fa(_fa){}
    bool operator < (const node& a) const{
        if(d!=a.d) return d>a.d;
        return fa>a.fa;
    }
};
int head[maxn];
int tot;
ll dis[maxn];
ll fa[maxn];
bool vis[maxn];
void init(){
    memset(head,-1,sizeof(head));
    tot=0;
}
void add(int t,int u,int v,ll w){
    e[tot].t=t;
    e[tot].to=v;
    e[tot].w=w;
    e[tot].nxt=head[u];
    head[u]=tot++;
}
ll dijkstra(int s){
    memset(dis,inf,sizeof(dis));
    memset(fa,inf,sizeof(fa));
    memset(vis,false,sizeof(vis));
    dis[s]=0,fa[s]=0;
    priority_queue<node> Q;
    Q.push(node(s,dis[s],fa[s]));
    while(!Q.empty()){
        node q=Q.top();
        Q.pop();
        int u=q.id;
        if(vis[u]) continue;
        vis[u]=true;
        for(int i=head[u];i!=-1;i=e[i].nxt){
            int t=e[i].t;
            int v=e[i].to;
            ll w=e[i].w;
            if(t==0){
                if(dis[u]+w<=dis[v]){
                    dis[v]=dis[u]+w;
                    fa[v]=0;
                    Q.push(node(v,dis[v],fa[v]));
                }
            }else{
                ll tmp=(fa[u]+w)*(fa[u]+w)+dis[u]-fa[u]*fa[u];
                if(tmp<dis[v]){
                    dis[v]=tmp;
                    fa[v]=fa[u]+w;
                    Q.push(node(v,dis[v],fa[v]));
                }else if(tmp==dis[v]){
                    if(fa[u]+w<fa[v]){
                        fa[v]=fa[u]+w;
                        Q.push(node(v,dis[v],fa[v]));
                    }
                }
            }
        }
    }
    return dis[n];
}
int main(){
    while(~scanf("%d%d",&n,&m)){
        init();
        int t,u,v;
        ll w;
        for(int i=1;i<=m;i++){
            scanf("%d%d%d%lld",&t,&u,&v,&w);
            add(t,u,v,w);
            add(t,v,u,w);
        }
        ll ans=dijkstra(1);
        printf("%lld\n",ans);
    }
    return 0;
}

原文地址:https://www.cnblogs.com/itcsl/p/9190610.html

时间: 2024-07-31 15:51:48

【CCF】行车路线 改编Dijkstra的相关文章

ccf 201712-4 行车路线(70分)

ccf 201712-4 行车路线 解题思路: 首先Dijkstra是基于贪心算法的,即每一次作出的选择都具有贪心选择性.此题由于有"如果连续走小道,小明的疲劳值会快速增加,连续走s公里小明会增加s2的疲劳度."这种情况,所以不能使用Dijkstra算法. 这里使用Bellman-Ford算法 70分备份待修改: 1 #include<iostream> 2 #include<cstring> 3 using namespace std; 4 int n,m;/

CCF 201712-4 行车路线 最短路

题意:一张n个点的图,有小路和大路,走大路花费的体力值是wi,如果连续走小路,花费的体力是连续走的小路的wi的和的平方,求1到n的最少花费体力 n <= 500, m <= 1e5 大一第一次考CCF的第四题,当年真的还是个最短路都不会的超级萌萌萌萌新,抄挑战的最短路板子(毒瘤代码)骗个40分的部分分,然后当时还怎么想都不明白怎么做 现在看起来就是裸的最短路各种各样的条件这样那样一下而已了= -... 几乎所有单源最短路问题都可以套用d[i]为起点到i点的最短路,这题也一样,如果是小路就记录一

ccf 2017 12 - 4 行车路线

附上代码: #include<stdio.h> #include<string.h> #define inf 0x7fffffff #include<iostream> #include<algorithm> #include<queue> using namespace std; typedef long long ll; const int MAXM = 1e6 + 5; int n, m; typedef struct NODE { int

Elaxia 的路线——抛弃Dijkstra 吧

方法是看的题解.大神告诉了我怎样快速判断特定点是否在其它两点之间的最短路上,感激不尽.我自己刚开始打的(屎)Dijkstra 又和从前一样是答案错误,这次少一些,两个.果断抛弃了Dijkstra,用上了辣鸡SPFA,过了. 1 #include<algorithm> 2 #include<iostream> 3 #include<cstring> 4 #include<vector> 5 #include<cstdio> 6 #include&l

带你找到五一最省的旅游路线【dijkstra算法推导详解】

前言 五一快到了,小张准备去旅游了! 查了查到各地的机票 因为今年被扣工资扣得很惨,小张手头不是很宽裕,必须精打细算.他想弄清去各个城市的最低开销. [嗯,不用考虑回来的开销.小张准备找警察叔叔说自己被拐卖,免费被送回来.] 如果他想从珠海飞到拉萨,最少要花多少机票钱呢?下面就说到我们今天要说的这个算法. 迪杰斯特拉(Dijkstra)算法 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为

CCF CSP个人题解汇总

趁着这波考CCF热来骗一波访问量 祝自己免修算法RP++ 区域赛RP++ 1.2题汇总在这:https://www.cnblogs.com/QAQorz/p/9650890.html 201803-4 棋局评估(对抗搜索):https://www.cnblogs.com/QAQorz/p/9650828.html 201712-4 行车路线(最短路):https://www.cnblogs.com/QAQorz/p/9588268.html 原文地址:https://www.cnblogs.co

【高德地图API】从零开始学高德JS API(五)路线规划——驾车|公交|步行

先来看两个问题:路线规划与导航有什么区别?步行导航与驾车导航有什么区别? 回答: 1.路线规划,指的是为用户提供3条路线推荐.[高德]在提供路线规划的时候,会提供用户自定义路线规划功能,这是别家没有做到的.导航,指的是为驾车用户提示路口信息,向左向右,进入匝道等信息. 2.我们这里说的步行导航和驾车导航,严格的说,应该是路线规划.从A地到B地,如果是驾车,路线规划会将公路路网做为搜索数据:如果是步行,过街天桥.地下通道.人行道做为搜索数据. ---------------------------

高德地图AndroidSDK 路线规划详情获取

我们用高德地图SDK在进行路径规划后,除了将线路添加到地图时候,往往还需要获取线路的详细描述信息,比方说路线长度,所需时间.路线的每一段情况等,就如高度地图这样: 我们就简答实现下这个功能,首先进行公交线路查询(不清楚的同学可以看下demo),在查询结果中进行处理: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41

away3d 汽车路线编辑器

2012年的时候,跟朋友去到一个公司,打算用away3d做一个赛车模拟养成游戏,后来由于种种原因,立项未成,由于朋友已经转行,自己也想对自己做过的事情有一些交代,所以将我负责的部分,赛道编辑器的源码公布开来,里头包括赛道制作,理想行车路线模拟等等,由于日久,其中有一部分源码已经遗失,为了能让编辑器跑起来,刚刚补了几个方法. 效果图如下: ui方面采用的是minimalcomponent,大神Kethei Peter的杰作,可惜大神已经看透红尘了: away3d用的是当时最新的away3d 4.0