本来想学一下配对堆的...结果学着学着就偏了...

之前 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 MB
Submit: 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 3
0 1 2 3 5 7
1 2 1
1 3 3
2 3 1

Sample Output

2

HINT

【注释】

请采用高效的堆来优化Dijkstra算法。

Source

BZOJ 3040: 最短路(road) ( 最短路 )的更多相关文章

  1. BZOJ 3040: 最短路(road) [Dijkstra + pb_ds]

    3040: 最短路(road) Time Limit: 60 Sec  Memory Limit: 200 MBSubmit: 2476  Solved: 814[Submit][Status][Di ...

  2. bzoj 1726: [Usaco2006 Nov]Roadblocks第二短路【dijskstra】

    严格次短路模板,用两个数组分别维护最短路和次短路,用dijskstra,每次更新的时候先更新最短路再更新次短路 写了spfa版的不知道为啥不对-- #include<iostream> # ...

  3. poj 3463 Sightseeing( 最短路与次短路)

    http://poj.org/problem?id=3463 Sightseeing Time Limit: 2000MS   Memory Limit: 65536K Total Submissio ...

  4. POJ---3463 Sightseeing 记录最短路和次短路的条数

    Sightseeing Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 9247   Accepted: 3242 Descr ...

  5. POJ 3463 Sightseeing 【最短路与次短路】

    题目 Tour operator Your Personal Holiday organises guided bus trips across the Benelux. Every day the ...

  6. 最短路和次短路问题,dijkstra算法

    /*  *题目大意:  *在一个有向图中,求从s到t两个点之间的最短路和比最短路长1的次短路的条数之和;  *  *算法思想:  *用A*求第K短路,目测会超时,直接在dijkstra算法上求次短路; ...

  7. UESTC30-最短路-Floyd最短路、spfa+链式前向星建图

    最短路 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) 在每年的校赛里,所有进入决赛的同 ...

  8. hdu1688(dijkstra求最短路和次短路)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1688 题意:第k短路,这里要求的是第1短路(即最短路),第2短路(即次短路),以及路径条数,最后如果最 ...

  9. CF 672C 两个人捡瓶子 最短路与次短路思想

    C. Recycling Bottles time limit per test 2 seconds memory limit per test 256 megabytes input standar ...

随机推荐

  1. RAC ORA-12170 ora-12535/tns-12535

    现象:开发人员抱怨RAC数据库出现了时连得上时连不上的情况,用SQLPLUS一试,果然有这样的情况: SQL> conn system/*******@bjyd 已连接. SQL> con ...

  2. Java 比较两日期相差天数

    (版本1) publicstaticint getIntervalDays(Date fDate, Date oDate) { if (null == fDate || null == oDate) ...

  3. The Standard Librarian: I/O and Function Objects: Containers of Pointers

    C++ Experts Forum The Standard Librarian: I/O and Function Objects: Containers of Pointers Matthew A ...

  4. MVC-05 Model(2)

    五.使用Code First数据库迁移 当Entity Framework Code First的数据模型发生异动时,默认会引发一个System.InvalidOpertaionException异常 ...

  5. ASP.NET jQuery 随笔 显示RadioButtonList成员选中的内容和值

    通过jQuery来获取RadioButtonList成员内容. <%@ Page Language="C#" AutoEventWireup="true" ...

  6. 韦根(Wiegand)数据传输格式

    韦根数据传输使用TTL电平,有两条数据线,分别称为DATA0和DATA1.无数据传输时,两条线都是高电平,当传输“1”时,DATA0为高,DATA1为低:当传输“0”时,DATA0为低,DATA1为高 ...

  7. nginx启动、开机自启动、重启、关闭

    yum -y  install nginx # yum info nginx Loaded plugins: fastestmirror Loading mirror speeds from cach ...

  8. 权限控制框架Spring Security 和Shiro 的总结

    关于权限控制,一开始感觉比较难,后来先是接触了Spring Security 学起来也比较吃力,再是学习了Shiro,感觉简单很多. 总体来说这些框架,主要做了两个事情 Authentication: ...

  9. ACM—循环小数转变成分数知识点_C++实现

    在小学的时候,我们的学生都能把“整数表示成分母是1的分数”,而且大多数学生也都能把有限小数和循环小数表示成分数的形式.这样,整数.分数.有限小数.循环小数都属于有理数.教科书中说“整数和分数统称有理数 ...

  10. Objective-c 协议(protocol)

    协议的作用类似地C++中对抽象基类的多重继承.类似于Java中的接口(interface)的概念.   协议是多个类共享方法的列表,协议中列出的方法在本类中并没有相应实现,而是别的类来实现这些方法. ...