首页 > 其他分享 >次短路径问题

次短路径问题

时间:2024-02-06 17:14:38浏览次数:25  
标签:int 路径 问题 quickin d1 d2 dis

一、问题描述

P2865 [USACO06NOV] Roadblocks G

二、问题简析

如果求最短路径,我们很自然会想到 \(Dijkstra\)。但是,这道题要求的是次短路径。
记到 \(u\) 的最短路径为 \(d_1[u]\),到 \(u\) 的次短路径为 \(d_2[u]\)。则 \(d_2[v] = d_1[u] + e(u, v)\) or \(d_2[u] + e(u, v).w\)。
因此,我们需要求出所有顶点的最短路径和次短路径。我们依然可以采用 \(Dijkstra\),只是多维护一个次短路径数组。

三、代码

#include <bits/stdc++.h>

using namespace std;

#define MAX 10				 // 最多顶点数
#define INF 1e8

typedef struct {int to, worth;} edge;

typedef pair<int, int> P;

int n, m;					// n -- 顶点数; m -- 边数
vector<edge> G[MAX];		// 邻接表
int d1[MAX], d2[MAX];		// d1 -- 最短路径; d2 -- 次短路径

struct cmp
{
	bool operator()(const P &a, const P &b)
	{
		return a.second > b.second;
	}
};

int quickin(void)
{
    int ret = 0;
    char ch = getchar();
    while (ch < '0' || ch > '9')
        ch = getchar();
    while (ch >= '0' && ch <= '9')
    {
        ret = 10 * ret + ch - '0';
        ch = getchar();
    }
    return ret;
}

void solve(void)
{
	// 初始化
	fill(begin(d1), end(d1), INF);
	fill(begin(d2), end(d2), INF);
	d1[1] = 0;								  // 只能初始化d1[0],d2[0] > 0未知

	priority_queue<P, vector<P>, cmp> Q;	  // 最小优先队列
	Q.push(P(1, 0));
	while (!Q.empty())
	{
		P p = Q.top();
		Q.pop();
		int u = p.first;					  // p.second可能是最短路径也可能是次短路径

		if (d2[u] < p.second)    continue;	  // u的最短路径和次短路径都能进入下一步
		
		for (int i = 0; i < G[u].size(); i++)
		{
			edge e = G[u][i];
			int dis = p.second + e.worth;	  // 最短路径 or 次短路径 + e(u, v).w

			// 最短路径
			if (d1[e.to] > dis)
			{
				swap(d1[e.to], dis);		  // 交换后,dis >= d1[e.to]
				Q.push(P(e.to, d1[e.to]));	  // s 到 e.to 的最短路径
			}

			// 次短路径
			if (d2[e.to] > dis && d1[e.to] < dis)	// 次短路径必须大于最短路径
			{
				d2[e.to] = dis;
				Q.push(P(e.to, d2[e.to]));    // s 到 e.to 的次短路径
			}
		}
	}

	printf("%d\n", d2[n]);
}

int main()
{
	n = quickin(), m = quickin();
	for (int i = 0; i < m; i++)
	{
		int a, b, c;
		a = quickin(), b = quickin(), c = quickin();
		G[a].push_back(edge{b, c});
		G[b].push_back(edge{a, c});
	}

	solve();

	return 0;
}

标签:int,路径,问题,quickin,d1,d2,dis
From: https://www.cnblogs.com/hoyd/p/18010026

相关文章

  • 解决VS Code中使用WSL开发Ruby程序每次打开控制台都需要输入/bin/bash --login的问题
    项目的开发环境是在VSCode上连接WSL开发,使用的语言是Ruby,每次打开控制台都需要先输入/bin/bash--login才能继续输入其他命令,为此,找遍了全网的资料,最终找到了解决的办法,特此记录一下,步骤如下:1.在终端输入vim~/.bashrc回车打开文件2.复制下面的代码粘贴至文件最后[[-s"$HOME/.......
  • 解决terraform部署storage account management policy问题
    承接上文TerraformAzurediagnosticsetting升级,之前说到azurerm_monitor_diagnostic_setting里的retentionpolicy已经deprecated了,需要用azurerm_storage_management_policy替换以recoveryservicevault的诊断设置为例,对应的azurerm_storage_management_policy可以参考下边的代......
  • nginx改变访问应用端口以及解决css,js或表单提交访问不到的问题
    场景如果原先某个网站是通过ip:8080直接访问的,现在想要加个前缀,并且去掉端口进行访问,比如ip/myapp去访问这个项目,可以通过nginx来实现这个过程。最近有个需求需要变更redmine的访问路径,从ip:8080改成ip/redmine,下面以redmine举例子。配置过程以ip/redmine来访问原先ip:8080的项......
  • java 关于有序获取多线程的返回结果问题,按提交任务的顺序,收集执行结果
    问题:以前做的多线程,执行的返回结果都是无序的,所以每次执行完毕后还要对结果集重新进行排序,增加了耗时; 今天突然想到一个思路,在给线程池提交任务的时候,可以提前获取任务总数,创建一个用于接收结果集的固定大小list2,然后子线程执行的时候把当前任务序号传进去,处理好数据后根据序号......
  • 问题:如何理解影片中的拍摄视点?
    问题:如何理解影片中的拍摄视点?参考答案如图所示......
  • 靶场搭建----phpstudy2018安装及注意问题
    安装官网下载:https://www.xp.cn/download.html新人推荐2018版本phpstudy介绍系统服务------开机自启非服务模式------开机不自启搭建好环境,此时服务器与客户端同时存在服务器:phpstudy所在的目录客户端:除phpstudy所在目录外的都是客户端调整phpstud......
  • navicat连接mysql服务遇到的问题
    问题现象及描述:navicat连接数据库提示:2003-Can'tconnecttoMySqlserveron'192.168.245.131',(unkownerror)问题可能出现的原因:1、数据库连接ip、端口、用户名、密码信息输入错误(数据库连接四要素)2、该用户不可远程连接3、linux防火墙未开放解决方式数据库连接ip问题:......
  • 问题:细菌生长繁殖的测定方法有()
    问题:细菌生长繁殖的测定方法有()A.计数法B.生理指标法C.平板划线法D.重量法参考答案如图所示......
  • 问题:使用微倾式水准仪的操作步骤是()、()、()、()。
    问题:使用微倾式水准仪的操作步骤是()、()、()、()。参考答案如图所示......
  • P3219 [HNOI2012] 三角形覆盖问题&P1222 三角形 题解
    严格单$\log$做法,附实现细节和代码。考虑从左往右扫描线,发现每次操作是线段上端点$-1$,插入线段,删除退化成点的线段。如果某时刻一条线段被另一条完全覆盖,那么这条线段显然不会产生贡献,可以删去。最后得到的线段一定是左端点单调递增时,右端点也单调递增,可以用set维护。当两......