POJ - 2449 Remmarguts' Date_freeze up的博客-程序员秘密

技术标签: 图论  

题意:

给定一个有 n 个点,m 条边的有向带权图,求 s 到 t 的第 k 短路。(n, k <= 1e3, m <= 1e5)

链接:

https://vjudge.net/problem/POJ-2449

解题思路:

k 短路练手,注意特判 s == t 。

参考代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>

using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
#define pb push_back
#define sz(a) ((int)a.size())
#define mem(a, b) memset(a, b, sizeof a)
#define lson (rt << 1)
#define rson (rt << 1 | 1)
#define gmid (l + r >> 1)
const int maxn = 1e3 + 5;
const int maxm = 1e6 + 5;
const int mod = 1e9 + 7;
const int inf = 0x3f3f3f3f;

struct Node{
    
	int ls, rs, dis, val, to;
} tr[maxm];
vector<pii> G1[maxn], G2[maxn];
priority_queue<pii, vector<pii>, greater<pii> > q;
int dis[maxn], fa[maxn], rt[maxn];
int n, m, sp, tp, k, tot;

int merge(int x, int y, int f){
    

	if(!x || !y) return x + y;
	if(tr[x].val > tr[y].val) swap(x, y);
	if(f) tr[++tot] = tr[x], x = tot;
	tr[x].rs = merge(tr[x].rs, y, f);
	if(tr[tr[x].ls].dis < tr[tr[x].rs].dis) swap(tr[x].ls, tr[x].rs);
	tr[x].dis = tr[tr[x].rs].dis + 1;
	return x;
}

void init(){
    

	for(int i = 1; i <= n; ++i) G1[i].clear(), G2[i].clear();
	for(int i = 1; i <= n; ++i) fa[i] = rt[i] = 0;
	while(!q.empty()) q.pop();
	tot = 0;
}

void dij(int s, vector<pii> G[]){
    

	for(int i = 1; i <= n; ++i) dis[i] = inf;
	dis[s] = 0, q.push({
    dis[s], s});
	while(!q.empty()){
    

		int u = q.top().second, d = q.top().first; q.pop();
		if(d != dis[u]) continue;
		for(int i = 0; i < sz(G[u]); ++i){
    

			int v = G[u][i].second, w = G[u][i].first;
			if(dis[v] > dis[u] + w){
    

				dis[v] = dis[u] + w;
				q.push({
    dis[v], v});
			}
		}
	}
}

void build(vector<pii> G[]){
    

	for(int u = 1; u <= n; ++u){
    

		if(dis[u] == inf) continue;
		for(int i = 0; i < sz(G[u]); ++i){
    

			int v = G[u][i].second, w = G[u][i].first;
			if(dis[u] == dis[v] + w && !fa[u]) fa[u] = v;
			else if(dis[v] != inf){
    

				tr[++tot] = {
    0, 0, 0, dis[v] + w - dis[u], v};
				rt[u] = merge(rt[u], tot, 0);
			}
		}
		q.push({
    dis[u], u});
	}
	while(!q.empty()){
    

		int u = q.top().second; q.pop();
		if(fa[u]) rt[u] = merge(rt[u], rt[fa[u]], 1);
	}
}

int solve(){
    

	dij(tp, G2); build(G1);
	if(sp == tp) ++k;
	if(!rt[sp]) return -1;
	if(k == 1) return dis[sp];
	int res = k - 1;
	q.push({
    tr[rt[sp]].val, rt[sp]});
	while(!q.empty()){
    

		int u = q.top().second, d = q.top().first; q.pop();
		if(--res == 0) return dis[sp] + d;
		if(int v = tr[u].ls) q.push({
    d - tr[u].val + tr[v].val, v});
		if(int v = tr[u].rs) q.push({
    d - tr[u].val + tr[v].val, v});
		if(int v = rt[tr[u].to]) q.push({
    d + tr[v].val, v});
	}
	return -1;
}

int main(){
    

//    ios::sync_with_stdio(0); cin.tie(0);
	while(scanf("%d%d", &n, &m) != EOF){
    

		init();
		for(int i = 1; i <= m; ++i){
    

			int u, v, w; scanf("%d%d%d", &u, &v, &w);
			G1[u].pb({
    w, v}), G2[v].pb({
    w, u});
		}
		scanf("%d%d%d", &sp, &tp, &k);
		int ret = solve();
		printf("%d\n", ret);
	}
    return 0;
}
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_44059127/article/details/102511792

智能推荐

反汇编调试内核驱动 Oops提示【转】_SimminonGarcia的博客-程序员秘密

以下部分内容转自:https://blog.csdn.net/jiatingqiang/article/details/7481497反汇编调试内核驱动arm-none-linux-gnueabi-objdump -S kmod-demo1.o &gt; a.txt什么是Oops?从语言学的角度说,Oops应该是一个拟声词。当出了点小事故,或者做了比较尴尬的事之后,你可以说"O...

Linux ftp_linuxftp修改pub_wuludan0217的博客-程序员秘密

安装ftp客户端及服务端都需安装[[email protected] etc]# yum install vsftpd -y (服务端)[[email protected] ~]# yum install lftp -y (客户端)将lftp服务加入列表[[email protected] etc]# systemctl start vsftpdvsftpd@ vsftpd....

mysql把一个字段分成多个字段_sql 把一个字段分成多个字段_iC ire的博客-程序员秘密

abc1aaa-bbb-bbb232vvv-nnnn243qqq-www-wwww12变成如下形式:ab1b2b3c1aaabbbbbb232vvvnnnn243qqqwwwwwww12我要mssql版本的别给我Mysql和Oracle的mysql&gt;select*fromt_fengchujun;+---...a b c1 ...

shinydashboard与shiny_史上最全(四)_R语言中文社区的博客-程序员秘密

作者:李誉辉四川大学在读研究生前言这是shinydashboard与shiny_史上最全第四篇,也是最后一篇。前文回顾:shinydashboard与shiny_史上...

人物照变成素描照_人物照素材app_Joyce_heart的博客-程序员秘密

1.准备好素描纸的素材和人物照片素材2.用PS打开人物素材,同时ctrl+J复制图层3.去色:ctrl+U把饱和度调到最低,然后ctrl+j复制图层,按ctrl+I反相操作4.将图层的混合模式改为颜色减淡5.点击滤镜-》其他-》最小值,数值设置为2(参考值)6.鼠标右键图层,混合选项,按住ALT键调整下一图层小滑块至头发纹路相对清晰。参考值0-707.将第一第二两图层按CT

Poj2449 Remmarguts' Date(SPFA+第k短路+A*)_threeh20的博客-程序员秘密

http://poj.org/problem?id=2449根据A*f(p)=g(p)+h(p)g(p)就是p点到s点最短距离h(p)就是p点到t点的距离h(p)的求法就是将边反过来求一遍单源最短路即可。为什么要用A*?A*的作用就是将普通的bfs变得更加智能,我们可以通过改变h函数来达到我们希望的效果。这道题,我们要求第K短路,那么怎么去求呢。思路就是利用A*,将较短的路径上的点放在前面去跑。这...

随便推点

java毕业设计——基于java+JavaBean+jsp的网上零食销售系统设计与实现(毕业论文+程序源码)——网上零食销售系统_基于jsp商品销售系统的毕业设计_毕业设计方案专家的博客-程序员秘密

大家好,今天给大家介绍基于java+JavaBean+jsp的网上零食销售系统设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦。文章目录:项目难度:中等难度适用场景:相关题目的毕业设计配套论文字数:9814个字34页包含内容:整套源码+完整毕业论文+答辩PPT+任务书+辅导视频+运行截图资源文件目录简图如下:提示:以下为毕业论文的简略介绍,项目源码及完整毕业论文下载地址见文末。绪 论省略JSP是一种动态的以网页为平台的开发技术,它具备很好的兼容性,可以引用JSP中自带的标签将Java代

【Java学习】使用JColorChooser(颜色选择器)_czpcalm的博客-程序员秘密

一、概述。java.swing.JColorChooser(颜色选择器)用于颜色的选择、编辑等操作。二、常用方法。1.public JColorChooser() : 构造器,创建一个默认初始颜色为白色的颜色选择器。2.public JColorChooser( Color initalColor) : 构造器,创建一个初始颜色为initColor的颜色选择器。3.public...

设置Serv-U FTP 支持被动模式连接 ,530错误等解决办法_weixin_30364147的博客-程序员秘密

设置Serv-U FTP 支持被动模式连接一大早被朋友说ftp始终连不上去,我自己去掉被动模式就可以连接。这个问题困扰了 我好长时间,是下面这篇文章解决了它。特在这里留个备份。我的问题是没有进行相应的端口设置。 设置支持被动(PASV)模式连接: 本地服务器--》设置--》高级--》PASV 端口范围--》写上范围,听说得写上4000以后的,可以写上5000-5005--》FTP设置完毕 进入本地...

每周汇报 - 树叶的图像分类_叶子图像分类模型_Lord12Snow3的博客-程序员秘密

数据集 图片简介这项任务是预测树叶图像的类别。该数据集包含176个类别,18353幅图像。每个类别至少有50幅图像用于训练。图片样品代码实现引入相关类库import pandas as pdimport tensorflow as tfimport matplotlib.pyplot as plt使用pandas读取csv文件,csv有两列,一列是图片位置,另一列是对应的标签。df = pd.read_csv('../input/classify-l...

卖云服务器的销售人员工资,云服务器的销售员好做吗_Love Snape的博客-程序员秘密

云服务器的销售员好做吗 内容精选换一换云服务器列表页面,云服务器的状态显示为“初始化”且超过15分钟没有变化。创建云服务器时,设置的委托权限有误。如果创建云服务器时已注入脚本,请查看创建云服务器时选择的委托权限是否正确。登录控制台,选择“计算 &gt; 弹性云服务器”。在云服务器列表页,单击云服务器名称。查看云服务器详情。云服务器列表查看云服务器详情。云服务器列表在“基本信息 &gt;挂载有NVM...

CVPR2020 | 对数字屏幕拍照时的摩尔纹怎么去除?_AI算法修炼营的博客-程序员秘密

点击上方“AI算法修炼营”,选择“星标”公众号精选作品,第一时间送达本文收录于CVPR2020,是华为诺亚方舟研究院的成果,主要解决的是,去除对数字屏幕拍照产生摩尔纹,有一定的应用价值。...

推荐文章

热门文章

相关标签