
第十二次CCF计算机软件能力认证 行车路线 (spfa)
发布日期:2021-05-08 02:34:33
浏览次数:33
分类:原创文章
本文共 2118 字,大约阅读时间需要 7 分钟。
分析
本题要求从1点出发,找到一条到达终点n的最短路。(单源最短路)
设type为路的种类,当路的type为0是代表是大路,此外所有的type都是代表小路。
因为题目保证答案不会超过1e6,所以type*type<=1e6,即type<=1000
C++ 代码
#include<bits/stdc++.h>using namespace std;const int N = 510,M = 2e5+10;int h[N],e[M],T[M],w[M],ne[M],idx; //T用来表示路的种类int n,m,dist[N][1010]; //dist[x][y]:到x点,类型为y的最短距离(<=1000)bool st[N][1010]; //st[x][y]:到x点,类型为y的路是否遍历过(<=1000)void add(int a,int b,int c,int type){ e[idx]=b,w[idx]=c,T[idx]=type,ne[idx]=h[a],h[a]=idx++;}struct node{ int x,type,w; //x点为当前点x,type为路的种类 bool operator<(const node &p)const{ return w>p.w; //当路的类型为大路时,它的w值通常会比小路的w大很多,所以优先选取大路来走 }};void spfa(){ memset(dist,0x3f,sizeof dist); priority_queue<node> q; //用一个优先队列存储所有节点 q.push({1,0,0}); //1:1号点,0:种类为0,到起点1的距离为0 dist[1][0]=0; while(q.size()) { auto t=q.top(); q.pop(); if(st[t.x][t.type]) continue; //此状态遍历过,直接跳过 st[t.x][t.type]=1; for(int i=h[t.x];~i;i=ne[i]) //枚举所有出边 { int j=e[i]; if(!T[i]) //如果type为0,说明为大路,按照平常求最短路逻辑进行计算即可 { if(dist[j][0]>dist[t.x][t.type]+w[i]) { dist[j][0]=dist[t.x][t.type]+w[i]; if(dist[j][0] <= 1e6) //答案保证不超过1e6 q.push({j,0,dist[j][0]}); } } else if(t.type+w[i]<=1000){ //路的种类为小路,且总和不超过1000 int tt=t.type+w[i]; //新的小路的种类为tt if(dist[j][tt]>dist[t.x][t.type]-t.type*t.type+tt*tt) { dist[j][tt]=dist[t.x][t.type]-t.type*t.type+tt*tt; if(dist[j][tt]<=1e6) //答案保证不超过1e6 q.push({j,tt,dist[j][tt]}); } } } }}int main(){ memset(h,-1,sizeof h); cin>>n>>m; int type,a,b,c; for(int i=0;i<m;i++) { cin>>type>>a>>b>>c; add(a,b,c,type),add(b,a,c,type); } spfa(); int res = 1e6; for (int i=0;i<=1000;i++ ) { res = min(res, dist[n][i]); //起点达到终点n,状态为i的最短距离 } printf("%d\n", res); return 0;}
发表评论
最新留言
留言是一种美德,欢迎回访!
[***.207.175.100]2025年04月11日 01时03分17秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
PyQt5之音乐播放器
2019-03-06
Redis进阶实践之十八 使用管道模式提高Redis查询的速度
2019-03-06
SQL注入
2019-03-06
#2036:改革春风吹满地
2019-03-06
MPI Maelstrom POJ - 1502 ⭐⭐ 【Dijkstra裸题】
2019-03-06
P1379 八数码难题 ( A* 算法 与 IDA_star 算法)
2019-03-06
算法学习笔记: 珂朵莉树
2019-03-06
Codeforces Round #664 题解(A ~ C)
2019-03-06
Problem A - Sequence with Digits (数学推导)
2019-03-06
Problem 330A - Cakeminator (思维)
2019-03-06
LeetCode75 颜色分类 (三路快排C++实现与应用)
2019-03-06
docker基础:容器生命周期管理命令
2019-03-06
Shell脚本学习指南
2019-03-06
C#开发BIMFACE系列35 服务端API之模型对比6:获取模型构建对比分类树
2019-03-06
C# 规范建议
2019-03-06
C语言+easyX图形库的推箱子实现
2019-03-06
反汇编-流程控制语句-2-循环控制语句分析
2019-03-06
调试vs2019代码的流程
2019-03-06
游戏外挂基础-概述
2019-03-06