堆优化 dijkstra +路径

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <bits/stdc++.h>

using namespace std;
const int N = 10010;
const int oo = 99999999;

int dis[N], pre[N];
bool vis[N];
int n, m, S;
struct Node{
	int u, v, w;
	Node(int u, int v, int w):u(u), v(v), w(w) {}
};
struct Headnode{
	int dis_this, u;
	bool operator < (const Headnode& now) const
	{
		return dis_this > now.dis_this;
	}
};
vector <int> G[N];
vector <Node> EE;

inline int read()
{
	int x = 0; char c = getchar();
	while(c < ‘0‘ || c > ‘9‘)c = getchar();
	while(c >= ‘0‘ && c <= ‘9‘)x = x * 10 + c - ‘0‘, c = getchar();
	return x;
}

inline void dijkstra(int start)
{
	priority_queue <Headnode> Q;
	for(int i = 1; i <= n; i ++)
		dis[i] = oo;
	dis[start] = 0;
	memset(vis, 0, sizeof(vis));
	Headnode HHH;
	HHH.dis_this = 0;
	HHH.u = start;
	Q.push(HHH);
	while(!Q.empty())
	{
		Headnode topp = Q.top();
		Q.pop();
		int u = topp.u;
		if(vis[u])
			continue;
		for(int i = 0; i < G[u].size(); i ++)
		{
			Node e = EE[G[u][i]];
			if(dis[e.v] > dis[u] + e.w)
			{
				dis[e.v] = dis[u] + e.w;
				pre[e.v] = G[u][i];
				Q.push((Headnode) {dis[e.v], e.v});
			}
		}
	}
}

inline void add(int u,int v,int w)
{
	EE.push_back(Node(u, v, w));
	G[u].push_back(EE.size() - 1);
}

int main()
{
	n = read();
	m = read();
	S = 1;

	for(int i = 1; i <= m; i ++)
	{
		int u = read();
		int v = read();
		int w = read();
		add(u, v, w);
	}
	dijkstra(S);
	while(1)
	{
		int endd = read();
		printf("%d",dis[endd]);
	}
	return 0;
}
/*
5 7
1 2 4
1 3 6
1 5 50
2 3 5
3 5 7
3 4 8
4 5 9
*/

  

时间: 2024-10-29 05:15:28

堆优化 dijkstra +路径的相关文章

【bzoj4016】[FJOI2014]最短路径树问题 堆优化Dijkstra+DFS树+树的点分治

题目描述 给一个包含n个点,m条边的无向连通图.从顶点1出发,往其余所有点分别走一次并返回. 往某一个点走时,选择总长度最短的路径走.若有多条长度最短的路径,则选择经过的顶点序列字典序最小的那条路径(如路径A为1,32,11,路径B为1,3,2,11,路径B字典序较小.注意是序列的字典序的最小,而非路径中节点编号相连的字符串字典序最小).到达该点后按原路返回,然后往其他点走,直到所有点都走过. 可以知道,经过的边会构成一棵最短路径树.请问,在这棵最短路径树上,最长的包含K个点的简单路径长度为多长

【bzoj1097】[POI2007]旅游景点atr 状压dp+堆优化Dijkstra

题目描述 FGD想从成都去上海旅游.在旅途中他希望经过一些城市并在那里欣赏风景,品尝风味小吃或者做其他的有趣的事情.经过这些城市的顺序不是完全随意的,比如说FGD不希望在刚吃过一顿大餐之后立刻去下一个城市登山,而是希望去另外什么地方喝下午茶.幸运的是,FGD的旅程不是既定的,他可以在某些旅行方案之间进行选择.由于FGD非常讨厌乘车的颠簸,他希望在满足他的要求的情况下,旅行的距离尽量短,这样他就有足够的精力来欣赏风景或者是泡MM了^_^.整个城市交通网络包含N个城市以及城市与城市之间的双向道路M条

【堆优化Dijkstra+字典序最短路方案】HDU1385-Minimum Transport Cost

[题目大意] 给出邻接矩阵以及到达各个点需要付出的代价(起点和终点没有代价),求出从给定起点到终点的最短路,并输出字典序最小的方案. [思路] 在堆优化Dijkstra中,用pre记录前驱.如果新方案和旧方案相等,比较两个方案的字典序. [坑点] 我先求出了最短路(包括终点要付出代价),输出的时候再减去终点的代价. 有可能会给出S==T的情况--在这种情况下,最短路就是0,减去代价要变成负数了QAQ所以要特判一下.坑了好几个小时orz 1 #include<iostream> 2 #inclu

BZOJ3040 最短路 (堆优化dijkstra)

这题不是裸的最短路么?但是一看数据范围就傻了.点数10^6,边数10^7.这个spfa就别想了(本来spfa就是相当不靠谱的玩意),看来是要用堆优化dijkstra了.但是,平时写dijkstra时为了偷懒直接用的STL的priority_queue,没办法改变权值,所以都是直接把pair压进堆里.然后时间复杂度O(mlogm),空间复杂度O(m),不靠谱.手写二叉堆?改变权值是O(logn)的,所以时间复杂度O(mlogn),空间复杂度O(n),还是要T.看来是需要一种比较牛逼的堆了. Fib

【bzoj3073】[Pa2011]Journeys 线段树优化建图+堆优化Dijkstra

题目描述 Seter建造了一个很大的星球,他准备建造N个国家和无数双向道路.N个国家很快建造好了,用1..N编号,但是他发现道路实在太多了,他要一条条建简直是不可能的!于是他以如下方式建造道路:(a,b),(c,d)表示,对于任意两个国家x,y,如果a<=x<=b,c<=y<=d,那么在xy之间建造一条道路.Seter保证不会有一个国家与自己之间有道路. Seter好不容易建好了所有道路,他现在在位于P号的首都.Seter想知道P号国家到任意一个国家最少需要经过几条道路.当然,Se

BZOJ 2118 墨墨的等式 堆优化Dijkstra

题目大意:给定n个物品,每个物品有一个非负价值,问[L,R]区间内有多少价值可以被凑出来 好题!!! 如果物品数量可以为负,显然求个gcd就行了 现在物品数量必须非负 任选一个ai>0,如果一个价值k?ai+x(0≤x<ai,k≥0)可以被凑出来,那么显然(k+1)?ai+x,(k+2)?ai+x,...都可以被凑出来 显然如果我们对于每个x都找到最小的k满足k?ai+x可以被凑出来,这个问题就解决了 那么怎么求呢?最短路,使用堆优化Dijkstra即可 时间复杂度O(n?ai?log2ai)

EOJ 1848 你是ACM吗? 用二叉堆优化dijkstra + spfa算法的学习

Description  随着中国经济的腾飞,中国的物流产业迎来了发展的春天.特别是在上海这样一个拥有广阔国内腹地的国际化大都市,物流业以空前的速度膨胀. 当然是大蛋糕就会吸引许多馋嘴猫,馋嘴猫多了就会有残酷的竞争.当大量资金流入物流产业时,KOP 集团为了稳坐在国内物流业的第一把交椅,决定对现行的运输方案进行改良,以减少自己的成本同时使其它竞争者知难而退. 作为世界100强的KOP集团当然知道要找到最优运输方案,肯定得靠数学和算法很好的软件工程师,于是他们理所当然地找到华东师范大学软件学院.决

配对堆优化Dijkstra算法小记

关于配对堆的一些小姿势: 1.配对堆是一颗多叉树. 2.包含优先队列的所有功能,可用于优化Dijkstra算法. 3.属于可并堆,因此对于集合合并维护最值的问题很实用. 4.速度快于一般的堆结构(左偏树,斜堆,随机堆--),具体时间复杂度: 合并(Merge):$O(1)$: 插入(Insert/Push):$O(1)$: 修改值(Change):$O(1) \sim O(\log n)$: 取出维护的最值(Top):$O(1)$: 弹出堆顶元素(Pop):$O(\log n)$: 我们依然拿洛

【51nod1443】路径和树(堆优化dijkstra乱搞)

点此看题面 大致题意:给你一个无向联通图,要求你求出这张图中从u开始的权值和最小的最短路径树的权值之和. 什么是最短路径树? 从\(u\)开始到任意点的最短路径与在原图中相比不变. 题解 既然要求最短路径,那么最容易想到的就是\(dijkstra\)和\(SPFA\)(毕竟Floyd的时间复杂度难以承受),又由于黄学长说能用\(dijkstra\)时尽量用\(dijkstra\),所以,我就打了一个堆优化的\(dijkstra\)开始乱搞. 其实,这道题目的思路真的挺简单的,只要朴素地做一遍\(