博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
P1608 路径统计
阅读量:5958 次
发布时间:2019-06-19

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

真正的最短路计数问题

这道题就是传说中的最短路计数问题了。

其实最短路计数就是在最短路算法上面添加两句话就完事了。

一句是在判断有道路与当前最短路一样长的时候,答案会变多。

一句是在更新最短路的时候,答案会变成从那个点开始的最短路。

所以就没有问题了?

这道题不仅有重边,还可能后面给你更小的边!

解决方法有两个:

  1. 乖乖用邻接矩阵,写一下基于矩阵的dijkstra。

  2. 用个邻接矩阵来判断下边的关系,看看有相同起点终点的边是否需要加进来。再换成邻接表跑堆优化的dijkstra。

我用的是第二种。我不会写矩阵的算法除了floyd。

代码:

#include
#include
#include
const int maxn = 2005;struct Edges{ int next, to, weight;} e[4000005];int b[maxn][maxn];int head[maxn], tot;int dist[maxn];int cnt[maxn];int n, m;struct Heapnodes{ int d, u; bool operator < (const Heapnodes &rhs) const { return d > rhs.d; }};int read(){ int ans = 0, s = 1; char ch = getchar(); while(ch > '9' || ch < '0'){ if(ch == '-') s = -1; ch = getchar(); } while(ch >= '0' && ch <= '9') ans = ans * 10 + ch - '0', ch = getchar(); return s * ans;}void link(int u, int v, int w){ e[++tot] = (Edges){head[u], v, w}; head[u] = tot;}void dijkstra(){ memset(dist, 0x3f, sizeof dist); std::priority_queue
heap; dist[1] = 0; heap.push((Heapnodes){dist[1], 1}); cnt[1] = 1; while(!heap.empty()) { Heapnodes x = heap.top(); heap.pop(); int d = x.d, u = x.u; if(d != dist[u]) continue; for(int i = head[u]; i; i = e[i].next) { int v = e[i].to; if(dist[u] + e[i].weight == dist[v]) cnt[v] += cnt[u]; if(dist[u] + e[i].weight < dist[v]) { dist[v] = dist[u] + e[i].weight; heap.push((Heapnodes){dist[v], v}); cnt[v] = cnt[u]; } } }}int main(){ memset(b, 0x3f, sizeof b); n = read(), m = read(); while(m--) { int u = read(), v = read(), w = read(); if(b[u][v] > w) { link(u, v, w); b[u][v] = w; } } dijkstra(); if(dist[n] != 0x3f3f3f3f) printf("%d %d\n", dist[n], cnt[n]); else printf("No answer\n"); return 0;}

转载于:https://www.cnblogs.com/Garen-Wang/p/9894036.html

你可能感兴趣的文章
check_snmp_int使用格式
查看>>
Linux系统通过SOCKS4/5做堡垒机
查看>>
线程间互斥:mutex
查看>>
我眼中的绩效考核“业务提成”
查看>>
android 消息推送
查看>>
新瓶旧酒ASP.NET AJAX(4) - 客户端脚本编程(JavaScript基本类型扩展)
查看>>
明略数据吴明辉:AI商业化的核心是让用户合理接受机器的错误
查看>>
自定义View实例(二)----一步一步教你实现QQ健康界面
查看>>
Frame-relay 综合实验-4
查看>>
这个算法告诉你点链接会泄露多少秘密,帮你判断该不该点
查看>>
Gradle2.0用户指南翻译——第五章. 疑难解答
查看>>
make[1]: *** [/usr/local/pcre//Makefile] Error 127
查看>>
zabbix 自定义LLD
查看>>
Liferay 前端性能调优(3) Gzip Filter
查看>>
prototype中的$R函数的用法
查看>>
1-3 SQL与建立关系型数据表
查看>>
Linux上vi(vim)编辑器使用教程
查看>>
数据库内核月报 - 2017年12月
查看>>
killws 利用xfire部署webservice (xfire1.6+spring1.6+maven 进化版)
查看>>
【ZooKeeper Notes 27】ZooKeeper管理员指南——部署与管理ZooKeeper
查看>>