博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【Dijkstra模板】codeforces715B Complete The Graph(最短路径)
阅读量:7049 次
发布时间:2019-06-28

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

记录一下Dijkstra的模板,主要加了一个优先队列,时间复杂度变成O(mlogn),速度快了很多。

struct Edge{	int from, to, dist;	Edge(int u, int v, int w) :from(u), to(v), dist(w) {}};struct HeapNode{	int d, u;	HeapNode(int x, int y) :d(x), u(y) {}	bool operator<(const HeapNode &rhs) const	{		return d > rhs.d;	}};struct Dijkstra{	vector
edges; //边保存 vector
G[maxn]; //保存每个点能到达的所有边 bool done[maxn]; //是否已经永久标记 int d[maxn]; //起点到各个点的距离 int p[maxn]; //最短路的上一条弧 void init() { for (int i = 0; i < maxn; i++) G[i].clear(); edges.clear(); } void addedge(int from, int to, int dist) { edges.push_back(Edge(from, to, dist)); G[from].push_back(edges.size()); } void dij() { priority_queue
Q; for (int i = 0; i < n; i++) d[i] = INF; d[s] = 0; memset(done, 0, sizeof(done)); Q.push(HeapNode(0,s)); while (!Q.empty()) { HeapNode x = Q.top(); Q.pop(); int u = x.u; if (done[u]) continue; done[u] = true; for (int i = 0; i < G[u].size(); i++) { Edge& e = edges[G[u][i]]; if (d[e.to] > d[u] + e.dist) { d[e.to] = d[u] + e.dist; p[e.to] = G[u][i]; Q.push(HeapNode(d[e.to], e.to)); } } } }};

下面写一下cf上这道题:

题意:

给出一个无向图,现在要求将所有边权为0的边的权值变成大于等于1的值,问怎么变化使最后的最短路径和为l

要点:

基本就是一个最短路径,题目想起来不难,先把所有权值不为0的图进行一次dij,特判一下。然后将权值为0的边一条一条赋值为1放入图并进行dij,如果此时的最短路径d<=l,那就把这条边改成l - dij()+w即可,剩余所有边改成无穷大。但这题我WA了快10次,主要是输出很烦,而且一开始模板还写错,数组上限也开小了,还是太菜了。

#include
#include
#include
#include
#include
#include
using namespace std;typedef long long ll;const int maxn = 1005;const int maxm = 20010;//注意这里const ll INF = 1000000000000000000;int n, m, l, s, t, cnt,tot;int S[maxm], T[maxm];struct Edge{ int from, to, dist; Edge(int u, int v, int w) :from(u), to(v), dist(w) {}};struct HeapNode{ int d, u; HeapNode(int x, int y) :d(x), u(y) {} bool operator<(const HeapNode &rhs) const { return d > rhs.d; }};struct Dijkstra{ vector
edges; //边保存 vector
G[maxn]; //保存每个点能到达的所有边 bool done[maxn]; //是否已经永久标记 ll d[maxn]; //起点到各个点的距离 int p[maxn]; //最短路的上一条弧 void init() { for (int i = 0; i < maxn; i++) G[i].clear(); edges.clear(); } void addedge(int from, int to, int dist) { edges.push_back(Edge(from, to, dist)); G[from].push_back(edges.size() - 1); } ll dij() { priority_queue
Q; for (int i = 0; i < maxn; i++) d[i] = INF; d[s] = 0; memset(done, 0, sizeof(done)); Q.push(HeapNode(0, s)); while (!Q.empty()) { HeapNode x = Q.top(); Q.pop(); int u = x.u; if (done[u]) continue; done[u] = true; for (int i = 0; i < G[u].size(); i++) { Edge& e = edges[G[u][i]]; if (d[e.to] > d[u] + e.dist&&d[u]+e.dist<=l)//这里有个优化 { d[e.to] = d[u] + e.dist; p[e.to] = G[u][i]; Q.push(HeapNode(d[e.to], e.to)); } } } return d[t]; } void print() { printf("YES\n"); int t = edges.size(); for (int i = 0; i < t - 2; i += 2) printf("%d %d %d\n", edges[i].from, edges[i].to, edges[i].dist); //printf("------------\n"); printf("%d %d %d\n", edges[t - 2].from, edges[t - 2].to, l - dij() + edges[t - 2].dist); //printf("------------\n"); for (int i = tot; i<=cnt; i++) printf("%d %d %I64d\n", S[i], T[i], INF); }};Dijkstra graph;int main(){ //while (1) { scanf("%d%d%d%d%d", &n, &m, &l, &s, &t); int u, v, w; graph.init(); for (int i = 0; i < m; i++) { scanf("%d%d%d", &u, &v, &w); if (w) { graph.addedge(u, v, w); graph.addedge(v, u, w); } else { S[++cnt] = u; T[cnt] = v; } } tot = 1; if (graph.dij() < l)//一开始特判 { //printf("%d\n", graph.dij()); printf("NO\n"); return 0; } else if (graph.dij() == l) { graph.print(); return 0; } for (; tot <= cnt; tot++)//将每个边分别赋值为1加入,如果最短路径小于l就脱出 { graph.addedge(S[tot], T[tot], 1); graph.addedge(T[tot], S[tot], 1); if (graph.dij() <= l) break; } tot++; //printf("%d %d\n", tot, cnt); if (tot > cnt + 1) printf("NO\n"); else graph.print(); } return 0;}

转载于:https://www.cnblogs.com/seasonal/p/10343654.html

你可能感兴趣的文章
深入Java集合学习系列:LinkedHashMap的实现原理
查看>>
JSpider(5):EventSinks,Rules&Resources
查看>>
Linux之sed
查看>>
开发可复用的从Domino中导出数据到Excel的类
查看>>
JAVA设计模式之【单例模式】
查看>>
ASP.NET Core 使用 Redis 客户端
查看>>
基础才是重中之重~stream和byte[]的概念与转化
查看>>
【Android错误集锦】Could not resolve net.qiujuer.genius:kit-handler:latest.integration.
查看>>
Educational Codeforces Round 21 D.Array Division(二分)
查看>>
Android 中文API (32) —— TimePicker.OnTimeChangedListener
查看>>
如何修改路由器的登录IP地址?
查看>>
外观(Facade)模式
查看>>
Building Android Apps 30条建议
查看>>
【Spring实战】—— 13 AspectJ注解切面
查看>>
16.4. jstat - Java Virtual Machine Statistics Monitoring Tool
查看>>
一脸懵逼学习KafKa集群的安装搭建--(一种高吞吐量的分布式发布订阅消息系统)...
查看>>
[Everyday Mathematics]20150209
查看>>
Python图片处理库之PIL
查看>>
数制系统
查看>>
cmd连接mysql操作命令
查看>>