博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hiho1093_spfa
阅读量:7120 次
发布时间:2019-06-28

本文共 1350 字,大约阅读时间需要 4 分钟。

题目

    SPFA模板题,题目中数据可能有两个点之间有多条边直接相连,使用 unordered_map< int, unordered_map< int, int>>, 来存储图的结构,可以方便的去除重边。

实现

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;#define max(a, b) (a) > (b)? (a) : (b)#define min(a, b) (a) < (b)? (a) : (b)unordered_map
> gMap;int gMinDist[100005];bool gInQueue[100005];int Spfa(int s, int t) { queue
Q; Q.push(s); memset(gMinDist, -1, sizeof(gMinDist)); memset(gInQueue, false, sizeof(gInQueue)); gMinDist[s] = 0; gInQueue[s] = true; //题目中不存在负权边,因此不需要检查有负权回路。检查存在负权回路,则需要通过 //判断否个点是否被更新超过 N 次,N为点的总数 while (!Q.empty()) { int u = Q.front(); Q.pop(); gInQueue[u] = false; for (auto x : gMap[u]) { int v = x.first; if (gMinDist[v] == -1 || gMinDist[v] > gMinDist[u] + x.second) { gMinDist[v] = gMinDist[u] + x.second; if (!gInQueue[v]) { //如果不存在队列中,则加入队列。剪枝优化 Q.push(v); } } } } return gMinDist[t];}int main() { int n, m, s, t; int u, v, d; scanf("%d %d %d %d", &n, &m, &s, &t); for (int i = 0; i < m; i++) { scanf("%d %d %d", &u, &v, &d); //用 unordered_map 存储图的结构,可以方便的去除重边 if (gMap.find(u) == gMap.end() || (gMap[u].find(v) == gMap[u].end() || gMap[u][v] > d)) { gMap[u][v] = d; gMap[v][u] = d; } } int min_dist = Spfa(s, t); printf("%d\n", min_dist); return 0;}

 

转载地址:http://kxiel.baihongyu.com/

你可能感兴趣的文章
9.6-9.7 awk
查看>>
单链表的读取、插入与删除
查看>>
shell之for循环的3个简单脚本
查看>>
CISCO 路由器的E1模块配置指南
查看>>
Kickstart+HTTP+DHCP+TFTP全自动批量安装部署Linux系统
查看>>
del
查看>>
idea 添加配置文件 绿叶子
查看>>
我的友情链接
查看>>
VC编译项目时缺少atlrx.h的解决办法
查看>>
Python OpenCV学习笔记之:使用MOG2视频背景消除
查看>>
8月第三周网络安全:境内感染网络病毒主机数73.7万个
查看>>
【Android】Service生命周期回顾
查看>>
11月国内浏览器市场份额:IE、Chrome均遭蚕食
查看>>
Windows下pip安装包报错:Microsoft Visual C++ 9.0 is required Unable to find vcvarsall.bat
查看>>
【公开课视频】ASP.NET MVC+EF入门-20130315
查看>>
Thinkphp 公共函数自动加载
查看>>
Linux内核之数据双链表
查看>>
【云计算的1024种玩法】巧用迁云工具轻松实现服务器迁移到ECS
查看>>
MaxCompute,基于Serverless的高可用大数据服务
查看>>
Linux下MySQL表名区分大小写
查看>>