【POJ】2449 Remmarguts' Date【k短路】

2024-09-05 13:58
文章标签 poj date 短路 2449 remmarguts

本文主要是介绍【POJ】2449 Remmarguts' Date【k短路】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目链接:Remmarguts’ Date

k短路模板题,用这题验证了我可持久化左偏树的正确性。

#include <stdio.h>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std ;typedef long long LL ;
typedef pair < int , int > pii ;
typedef pair < LL , int > pli ;
typedef unsigned long long ULL ;#define clr( a , x ) memset ( a , x , sizeof a )
#define st first
#define ed secondconst int MAXN = 10005 ;
const int BLOCK = 22 ;
const LL INF = 1e18 ;namespace Leftist_Tree {struct Node {int l , r , x , h ;LL val ;} T[MAXN * 200] ;int Root[MAXN] ;int node_num ;int newnode ( const Node& o ) {T[node_num] = o ;return node_num ++ ;}void init () {node_num = 1 ;T[0].l = T[0].r = T[0].x = T[0].h = 0 ;T[0].val = INF ;}int merge ( int x , int y ) {if ( !x ) return y ;if ( T[x].val > T[y].val ) swap ( x , y ) ;int o = newnode ( T[x] ) ;T[o].r = merge ( T[o].r , y ) ;if ( T[T[o].l].h < T[T[o].r].h ) swap ( T[o].l , T[o].r ) ;T[o].h = T[T[o].r].h + 1 ;return o ;}void insert ( int& x , LL val , int v ) {int o = newnode ( T[0] ) ;T[o].val = val , T[o].x = v ;x = merge ( x , o ) ;}void show ( int o ) {printf ( "%d %lld %lld %lld\n" , o , T[o].val , T[T[o].l].val , T[T[o].r].val ) ;if ( T[o].l ) show ( T[o].l ) ;if ( T[o].r ) show ( T[o].r ) ;}
}using namespace Leftist_Tree ;
vector < pii > G[MAXN] , E[MAXN] ;
int vis[MAXN] ;
int in[MAXN] , p[MAXN] ;
LL d[MAXN] ;
int s , t ;
int n , m , k ;void addedge ( int u , int v , int c ) {G[u].push_back ( pii ( v , c ) ) ;E[v].push_back ( pii ( u , c ) ) ;
}void dij () {priority_queue < pli > q ;d[t] = 0 ;q.push ( pli ( 0 , t ) ) ;while ( !q.empty () ) {int u = q.top ().ed ;q.pop () ;if ( vis[u] ) continue ;vis[u] = 1 ;for ( int i = 0 ; i < E[u].size () ; ++ i ) {int v = E[u][i].st ;if ( d[v] > d[u] + E[u][i].ed ) {p[v] = u ;d[v] = d[u] + E[u][i].ed ;q.push ( pli ( -d[v] , v ) ) ;}}}
}void dfs ( int u ) {if ( vis[u] ) return ;vis[u] = 1 ;if ( p[u] ) Root[u] = Root[p[u]] ;int flag = 1 ;for ( int i = 0 ; i < G[u].size () ; ++ i ) {int v = G[u][i].st ;if ( d[v] == INF ) continue ;if ( p[u] == v && d[u] == G[u][i].ed + d[v] && flag ) {flag = 0 ;continue ;}LL val = d[v] - d[u] + G[u][i].ed ;insert ( Root[u] , val , v ) ;}for ( int i = 0 ; i < E[u].size () ; ++ i ) {if ( p[E[u][i].st] == u ) dfs ( E[u][i].st ) ;}
}void solve () {for ( int i = 1 ; i <= n ; ++ i ) {G[i].clear () ;E[i].clear () ;d[i] = INF ;vis[i] = 0 ;p[i] = 0 ;}for ( int i = 0 ; i < m ; ++ i ) {int u , v , c ;scanf ( "%d%d%d" , &u , &v , &c ) ;addedge ( u , v , c ) ;}scanf ( "%d%d%d" , &s , &t , &k ) ;dij () ;if ( d[s] == INF ) {printf ( "-1\n" ) ;return ;}if ( s != t ) -- k ;if ( !k ) {printf ( "%lld\n" , d[s] ) ;return ;}for ( int i = 1 ; i <= n ; ++ i ) {vis[i] = 0 ;}init () ;Root[t] = 0 ;dfs ( t ) ;priority_queue < pli , vector < pli > , greater < pli > > q ;if ( Root[s] ) q.push ( pli ( d[s] + T[Root[s]].val , Root[s] ) ) ;while ( k -- ) {if ( q.empty () ) {printf ( "-1\n" ) ;return ;}pli u = q.top () ;q.pop () ;if ( !k ) {printf ( "%lld\n" , u.st ) ;return ;}int x = T[u.ed].l , y = T[u.ed].r , v = T[u.ed].x ;if ( Root[v] ) q.push ( pli ( u.st + T[Root[v]].val , Root[v] ) ) ;if ( x ) q.push ( pli ( u.st + T[x].val - T[u.ed].val , x ) ) ;if ( y ) q.push ( pli ( u.st + T[y].val - T[u.ed].val , y ) ) ;}
}int main () {while ( ~scanf ( "%d%d" , &n , &m ) ) solve () ;return 0 ;
}

这篇关于【POJ】2449 Remmarguts' Date【k短路】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/1139150

相关文章

Java中Date、LocalDate、LocalDateTime、LocalTime、时间戳之间的相互转换代码

《Java中Date、LocalDate、LocalDateTime、LocalTime、时间戳之间的相互转换代码》:本文主要介绍Java中日期时间转换的多种方法,包括将Date转换为LocalD... 目录一、Date转LocalDateTime二、Date转LocalDate三、LocalDateTim

Python使用date模块进行日期处理的终极指南

《Python使用date模块进行日期处理的终极指南》在处理与时间相关的数据时,Python的date模块是开发者最趁手的工具之一,本文将用通俗的语言,结合真实案例,带您掌握date模块的六大核心功能... 目录引言一、date模块的核心功能1.1 日期表示1.2 日期计算1.3 日期比较二、六大常用方法详

MySQL 日期时间格式化函数 DATE_FORMAT() 的使用示例详解

《MySQL日期时间格式化函数DATE_FORMAT()的使用示例详解》`DATE_FORMAT()`是MySQL中用于格式化日期时间的函数,本文详细介绍了其语法、格式化字符串的含义以及常见日期... 目录一、DATE_FORMAT()语法二、格式化字符串详解三、常见日期时间格式组合四、业务场景五、总结一、

Oracle的to_date()函数详解

《Oracle的to_date()函数详解》Oracle的to_date()函数用于日期格式转换,需要注意Oracle中不区分大小写的MM和mm格式代码,应使用mi代替分钟,此外,Oracle还支持毫... 目录oracle的to_date()函数一.在使用Oracle的to_date函数来做日期转换二.日

Java将时间戳转换为Date对象的方法小结

《Java将时间戳转换为Date对象的方法小结》在Java编程中,处理日期和时间是一个常见需求,特别是在处理网络通信或者数据库操作时,本文主要为大家整理了Java中将时间戳转换为Date对象的方法... 目录1. 理解时间戳2. Date 类的构造函数3. 转换示例4. 处理可能的异常5. 考虑时区问题6.

poj 3974 and hdu 3068 最长回文串的O(n)解法(Manacher算法)

求一段字符串中的最长回文串。 因为数据量比较大,用原来的O(n^2)会爆。 小白上的O(n^2)解法代码:TLE啦~ #include<stdio.h>#include<string.h>const int Maxn = 1000000;char s[Maxn];int main(){char e[] = {"END"};while(scanf("%s", s) != EO

hdu 2602 and poj 3624(01背包)

01背包的模板题。 hdu2602代码: #include<stdio.h>#include<string.h>const int MaxN = 1001;int max(int a, int b){return a > b ? a : b;}int w[MaxN];int v[MaxN];int dp[MaxN];int main(){int T;int N, V;s

poj 1511 Invitation Cards(spfa最短路)

题意是给你点与点之间的距离,求来回到点1的最短路中的边权和。 因为边很大,不能用原来的dijkstra什么的,所以用spfa来做。并且注意要用long long int 来存储。 稍微改了一下学长的模板。 stack stl 实现代码: #include<stdio.h>#include<stack>using namespace std;const int M

poj 3259 uva 558 Wormholes(bellman最短路负权回路判断)

poj 3259: 题意:John的农场里n块地,m条路连接两块地,w个虫洞,虫洞是一条单向路,不但会把你传送到目的地,而且时间会倒退Ts。 任务是求你会不会在从某块地出发后又回来,看到了离开之前的自己。 判断树中是否存在负权回路就ok了。 bellman代码: #include<stdio.h>const int MaxN = 501;//农场数const int

poj 1258 Agri-Net(最小生成树模板代码)

感觉用这题来当模板更适合。 题意就是给你邻接矩阵求最小生成树啦。~ prim代码:效率很高。172k...0ms。 #include<stdio.h>#include<algorithm>using namespace std;const int MaxN = 101;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int n