POJ 1511 - Invitation Cards 邻接表 Dijkstra堆优化
昨天的题太水了,堆优化跑的不爽,今天换了一个题,1000000个点,1000000条边= =
试一试邻接表
写的过程中遇到了一些问题,由于习惯于把数据结构封装在 struct 里,结果 int [1000000] 导致 struct 爆栈,此问题亟待解决..
实力碾压SPFA 2500 ms,有图为证
- #include <cstdio>
- #include <cstdlib>
- #include <cstring>
- #include <algorithm>
- #define MAXP (1000000 + 10)
- #define MAXQ MAXP
- #define INF 2000000000
- using namespace std;
- struct Edge{
- int u, v, w;
- }e[MAXQ];
- //struct Graph{
- static int firstEdge[MAXP], cnt;
- struct E{
- int v, w, next;
- E(){}
- E(int U, int V, int W):v(V),w(W),next(firstEdge[U]){}
- }edges[MAXQ];
- inline void reset(){
- memset(firstEdge, -1, sizeof(firstEdge));
- cnt = 0;
- }
- inline void addEdge(int u, int v, int w){
- edges[cnt] = E(u, v, w);
- firstEdge[u] = cnt++;
- }
- //}g;
- int d1[MAXP], d2[MAXP], *d;
- template <class T>
- T min(T &a, T &b){
- return a < b ? a : b;
- }
- //struct BHeap{
- int heap[MAXP], n, index[MAXP];
- //BHeap(){}
- inline void up(int i){
- for (int j = i >> 1; j > 0; j >>= 1){
- if (d[heap[i]] < d[heap[j]]){
- swap(index[heap[i]], index[heap[j]]);
- swap(heap[i], heap[j]);
- i = j;
- }
- else break;
- }
- }
- inline void down(int i){
- for (int j = i << 1; j <= n; j <<= 1){
- j += (j < n) && (d[heap[j]] > d[heap[j + 1]]);
- if (d[heap[i]] > d[heap[j]]){
- swap(index[heap[i]], index[heap[j]]);
- swap(heap[i], heap[j]);
- i = j;
- }
- else break;
- }
- }
- inline void push(int i){
- heap[++n] = i;
- index[i] = n;
- up(n);
- }
- inline int pop(){
- if (!n) return 0;
- swap(index[heap[1]], index[heap[n]]);
- swap(heap[1], heap[n--]);
- down(1);
- return heap[n + 1];
- }
- void BHeap(int N){
- n = 0;
- for (int i = 2; i <= N; i++){
- push(i);
- }
- }
- //}heap;
- bool been[MAXP];
- void Dijkstra(){
- memset(been, 0, sizeof(been));
- been[1] = 1;
- while (int v = pop()){
- been[v] = 1;
- for (int i = firstEdge[v]; ~i; i = edges[i].next){
- if (!been[edges[i].v]){
- if (d[edges[i].v] > d[v] + edges[i].w){
- d[edges[i].v] = d[v] + edges[i].w;
- up(index[edges[i].v]);
- }
- }
- }
- }
- }
- int main(){
- int n, p, q;
- freopen("fin.c", "r", stdin);
- scanf("%d", &n);
- while (n--){
- scanf("%d%d", &p, &q);
- for (int i = 0; i < q; i++){
- scanf("%d%d%d", &e[i].u, &e[i].v, &e[i].w);
- }
- reset();
- d = d1;
- for (int i = 1; i <= p; i++){
- d[i] = INF;
- }
- for (int i = 0; i < q; i++){
- addEdge(e[i].u, e[i].v, e[i].w);
- if (e[i].u == 1){
- d[e[i].v] = min(d[e[i].v], e[i].w);
- }
- }
- BHeap(p);
- Dijkstra();
- reset();
- d = d2;
- for (int i = 1; i <= p; i++){
- d[i] = INF;
- }
- for (int i = 0; i < q; i++){
- addEdge(e[i].v, e[i].u, e[i].w);
- if (e[i].v == 1){
- d[e[i].u] = min(d[e[i].u], e[i].w);
- }
- }
- BHeap(p);
- Dijkstra();
- long long ans = 0;
- for (int i = 2; i <= p; i++){
- ans += d1[i] + d2[i];
- }
- printf("%lld\n", ans);
- }
- }
POJ 1511 - Invitation Cards 邻接表 Dijkstra堆优化的更多相关文章
- POJ 1511 Invitation Cards / UVA 721 Invitation Cards / SPOJ Invitation / UVAlive Invitation Cards / SCU 1132 Invitation Cards / ZOJ 2008 Invitation Cards / HDU 1535 (图论,最短路径)
POJ 1511 Invitation Cards / UVA 721 Invitation Cards / SPOJ Invitation / UVAlive Invitation Cards / ...
- POJ 1511 Invitation Cards (spfa的邻接表)
Invitation Cards Time Limit : 16000/8000ms (Java/Other) Memory Limit : 524288/262144K (Java/Other) ...
- POJ 1511 - Invitation Cards (dijkstra优先队列)
题目链接:http://poj.org/problem?id=1511 就是求从起点到其他点的最短距离加上其他点到起点的最短距离的和 , 注意路是单向的. 因为点和边很多, 所以用dijkstra优先 ...
- POJ 1511 Invitation Cards(单源最短路,优先队列优化的Dijkstra)
Invitation Cards Time Limit: 8000MS Memory Limit: 262144K Total Submissions: 16178 Accepted: 526 ...
- POJ 1511 Invitation Cards (ZOJ 2008) 使用优先队列的dijkstra
传送门: http://poj.org/problem?id=1511 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1008 ...
- POJ - 1511 Invitation Cards(Dijkstra变形题)
题意: 给定一个有向图,求从源点到其他各点的往返最短路径和.且这个图有一个性质:任何一个环都会经过源点. 图中的节点个数范围:0-100w; 分析: 我们先可以利用Dijkstra算法求解从源点到其余 ...
- DIjkstra(反向边) POJ 3268 Silver Cow Party || POJ 1511 Invitation Cards
题目传送门 1 2 题意:有向图,所有点先走到x点,在从x点返回,问其中最大的某点最短路程 分析:对图正反都跑一次最短路,开两个数组记录x到其余点的距离,这样就能求出来的最短路以及回去的最短路. PO ...
- Poj 1511 Invitation Cards(spfa)
Invitation Cards Time Limit: 8000MS Memory Limit: 262144K Total Submissions: 24460 Accepted: 8091 De ...
- [POJ] 1511 Invitation Cards
Invitation Cards Time Limit: 8000MS Memory Limit: 262144K Total Submissions: 18198 Accepted: 596 ...
随机推荐
- c#防止多次运行代码收集
1.原文:经过我的测试,还比较好用,但是有个问题,如果不注销,用另一个用户进入,则程序不能判断出已运行.所以只限于用在单用户环境,还是不太完美. class Program { [STAThread] ...
- python 类中staticmethod,classmethod,普通方法
1.staticmethod:静态方法和全局函数类似,但是通过类和对象调用. 2.classmethod:类方法和类相关的方法,第一个参数是class对象(不是实例对象).在python中class也 ...
- ASP.NET MVC利用ajax把action的JavaScript注册到页面并执行
相信大家在做Webform时经常会遇到在页面的后台CS文件中根据数据运行结果修改页面显示样式.显示(隐藏).或者弹出框,当时我们会用到ScriptManage或者Page来向页面注册一段js来实现页面 ...
- OAF_文件系列5_实现OAF解析XML文件javax.xml.parsers(案例)
20150729 Created By BaoXinjian
- [家里蹲大学数学杂志]第013期2010年西安偏微分方程暑期班试题---NSE,非线性椭圆,平均曲率流,非线性守恒律,拟微分算子
Navier-Stokes equations 1 Let $\omega$ be a domain in $\bbR^3$, complement of a compact set $\mathca ...
- Mathematica 计算矩阵的伴随矩阵
AdjointMatrix[M_] := Module[{Ma, B, n, i, j}, Ma = Minors[M]; B = Ma; n = Dimensions[M][[1] ...
- (转)无法将类型为“Microsoft.Office.Interop.Word.ApplicationClass”的 COM 对象强制转换为接口类型“Microsoft.Office.Interop.Word._Application”。此操作失败的原因是对 IID 为“{00020970-
HRESULT:0x80030002 无法将类型为“Microsoft.Office.Interop.Word.ApplicationClass”的 COM 对象强制转换为接口类型“Microsoft ...
- nginx+tomcat+memcached-session-manager组成简单的负载均衡和集群
1.搭建环境 192.168.29.128(luxh-01.com) 安装nginx,参考 http://www.cnblogs.com/luxh/p/4067038.html 192.168.29. ...
- Mono addin 学习笔记 3
典型的基于Mono addin插件框架的应用程序有以下一个部分组成: 1. 主应用程序:提供了一系列的扩展点(Extension Point)供其他应用进行扩展: 2. 扩展插件: 其部署结构图如下为 ...
- ubuntu 12.04 设置代理
一. Ubuntu 12.04 apt-get 代理设置 由于公司通过代理上网,firefox的代理设置很容易就搞定了,但是通过apt-get安装软件还是不行,于是,查阅了很多资料,最多的方法就是网上 ...