BZOJ 3040: 最短路(road) ( 最短路 )
2015-07-04 22:52
585 查看
本来想学一下配对堆的...结果学着学着就偏了...
之前 kpm 写过这道题 , 前面的边不理它都能 AC .. 我也懒得去写前面的加边了...
用 C++ pb_ds 库里的 pairing_heap 水过去的...
----------------------------------------------------------------------
#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>#include<ext/pb_ds/priority_queue.hpp> #define rep( i , n ) for( int i = 0 ; i < n ; ++i )#define clr( x , c ) memset( x , c , sizeof( x ) )#define Rep( i , n ) for( int i = 1 ; i <= n ; ++i )#define mk make_pair using namespace std;
using namespace __gnu_pbds; typedef long long ll;typedef pair< ll , int > pli; const ll inf = ll( 1e18 );const int maxn = 1000000 + 5;const int maxm = 10000000 + 10; struct edge { int to; ll dist; edge* next;}; edge* pt , E[ maxm ];edge* head[ maxn ]; void edge_init() { pt = E; clr( head , 0 );} inline void add_edge( int u , int v , ll d ) { pt -> to = v; pt -> dist = d; pt -> next = head[ u ]; head[ u ] = pt++;} __gnu_pbds :: priority_queue< pli , greater< pli > , pairing_heap_tag > :: point_iterator pos[ maxn ];__gnu_pbds :: priority_queue< pli , greater< pli > , pairing_heap_tag > Q; ll d[ maxn ];int n; void dijkstra() { rep( i , n ) d[ i ] = inf; d[ 0 ] = 0; Q.push( mk( 0 , 0 ) ); while( ! Q.empty() ) { int x = Q.top().second; Q.pop(); for( edge* e = head[ x ] ; e ; e = e -> next ) { int to = e -> to; if( d[ to ] > d[ x ] + e -> dist ) { d[ to ] = d[ x ] + e -> dist; if( pos[ to ] != 0 ) Q.modify( pos[ to ] , mk( d[ to ] , to ) ); else pos[ to ] = Q.push( mk( d[ to ] , to ) ); } } }} inline int read() { int ans = 0; char c = getchar(); for( ; ! isdigit( c ) ; c = getchar() ); for( ; isdigit( c ) ; c = getchar() ) ans = ans * 10 + c - '0'; return ans;} void Read() { n = read(); int m = read() , t = read(); m -= t; rep( i , 5 ) t = read(); while( m-- ) { int u = read() , v = read() , d = read(); u-- , v--; add_edge( u , v , d ); }} int main() { freopen( "test.in" , "r" , stdin ); edge_init(); Read(); dijkstra(); cout << d[ n - 1 ] << "\n"; return 0;}
----------------------------------------------------------------------
3040: 最短路(road)
Time Limit: 60 Sec Memory Limit: 200 MBSubmit: 1843 Solved: 561
[Submit][Status][Discuss]
Description
N个点,M条边的有向图,求点1到点N的最短路(保证存在)。1<=N<=1000000,1<=M<=10000000
Input
第一行两个整数N、M,表示点数和边数。第二行六个整数T、rxa、rxc、rya、ryc、rp。
前T条边采用如下方式生成:
1.初始化x=y=z=0。
2.重复以下过程T次:
x=(x*rxa+rxc)%rp;
y=(y*rya+ryc)%rp;
a=min(x%n+1,y%n+1);
b=max(y%n+1,y%n+1);
则有一条从a到b的,长度为1e8-100*a的有向边。
后M-T条边采用读入方式:
接下来M-T行每行三个整数x,y,z,表示一条从x到y长度为z的有向边。
1<=x,y<=N,0<z,rxa,rxc,rya,ryc,rp<2^31
Output
一个整数,表示1~N的最短路。Sample Input
3 30 1 2 3 5 7
1 2 1
1 3 3
2 3 1
Sample Output
2HINT
【注释】请采用高效的堆来优化Dijkstra算法。
Source
WC2013营员交流-lydrainbowcat相关文章推荐
- spring AOP概念讲解
- UIView常用操作
- ucore操作系统lab6 —— 调度算法
- hdu 5276(BestCoder Round#46 1001) YJC tricks time
- 正则表达式
- [leedcode 07]Reverse Integer
- javascript双击事件取消默认的两次单击事件
- 程序员学习能力提升三要素
- python学习笔记--登录
- Tomcat安全配置与性能优化
- spring配置文件中xsd引用问题
- java基础学习笔记汇总之面向对象三大特征
- ROS 位置反馈控制机器人
- java基础学习笔记汇总之面向对象三大特征
- CSS--选择器
- java中volatile关键字的含义
- VC++实现生成右键菜单及添加图标
- maven 项目中使用 jstl标签
- 2015年6月总结
- JavaScript获取元素CSS属性