POJ-1511 Invitation Cards 往返最短路 邻接表 大量数据下的处理方法
题目链接:https://cn.vjudge.net/problem/POJ-1511
题意
给出一个图
求从节点1到任意节点的往返路程和
思路
没有考虑稀疏图,上手给了一个Dijsktra(按紫书上的存边方法)
直接超时
写了一个极限大小数据
发现读入时间很长,Dij时间也很长,相当于超时超到姥姥家了
赶紧做优化
- 发现稀疏图,于是换Bellman(spfa)
- 换邻接表
- (虽然没有必要)scanf换成getchar输入模版,大量数据可以节省大概800ms的样子
- 稀疏图适用Bellman(optimed),稠密图适用Dijsktra
- 对大数据(maxn>1e6),一定要用邻接表
- 对大数据(x>1e9, maxm>1e6),用输入模版可以降大概800ms
代码
#include <queue>
#include <cstdio>
#include <vector>
#include <cstring>
using namespace std;
const int maxn=1e6, maxm=maxn;
const long long INF=1LL<<60;
struct Edge{
int to, dis, next;
}edges[maxm+5], redges[maxn+5];
int size, rsize, head[maxn+5], rhead[maxn+5];
inline void addEdge(int from, int to, int dis){
edges[size]=Edge{to, dis, head[from]};
head[from]=size++;
redges[rsize]=Edge{from, dis, rhead[to]};
rhead[to]=rsize++;
}
long long dist[maxn+5];
long long Bellman(int n, int ahead[], Edge *aedges){
int cnt[maxn+5]={0};
bool inq[maxn+5]={false};
queue<int> que;
for (int i=0; i<=n; i++) dist[i]=INF; dist[1]=0;
que.push(1);
while (que.size()){
int from=que.front(); que.pop();
inq[from]=false;
for (int i=ahead[from]; i!=-1; i=aedges[i].next){
Edge &e=aedges[i];
int &to=e.to, &dis=e.dis;
if (dist[to]<=dist[from]+dis) continue;
dist[to]=dist[from]+dis;
if (inq[to]) continue;
inq[to]=true;
que.push(to);
// if (++cnt[to]>n) return -1;
}
}
long long sum=0;
for (int i=1; i<=n; i++) if (dist[i]<INF)
sum+=dist[i];
return sum;
}
void init(void){
memset(head, -1, sizeof(head));
memset(rhead, -1, sizeof(rhead));
rsize=size=0;
}
inline void read(int &num){
char in;
in=getchar();
while(in <'0'|| in > '9') in=getchar();
num = in -'0';
while(in =getchar(),in >='0'&&in <='9')
num *=10, num+=in-'0';
}
int main(void){
int T, n, m, from, to, dis;
scanf("%d", &T);
while (T--){
init();
scanf("%d%d", &n, &m);
for (int i=0; i<m; i++){
read(from); read(to); read(dis);
addEdge(from, to, dis);
}printf("%lld\n", Bellman(n, head, edges)+Bellman(n, rhead, redges));
}
return 0;
}
| Time | Memory | Length | Lang | Submitted |
|---|---|---|---|---|
| 860ms | 40672kB | 1914 | G++ | 2018-05-26 19:26:39 |
POJ-1511 Invitation Cards 往返最短路 邻接表 大量数据下的处理方法的更多相关文章
- POJ 1511 Invitation Cards(Dijkstra(优先队列)+SPFA(邻接表优化))
题目链接:http://poj.org/problem?id=1511 题目大意:给你n个点,m条边(1<=n<=m<=1e6),每条边长度不超过1e9.问你从起点到各个点以及从各个 ...
- POJ 1511 Invitation Cards (最短路spfa)
Invitation Cards 题目链接: http://acm.hust.edu.cn/vjudge/contest/122685#problem/J Description In the age ...
- poj 1511 Invitation Cards(最短路中等题)
In the age of television, not many people attend theater performances. Antique Comedians of Malidine ...
- poj 1511 Invitation Cards (最短路)
Invitation Cards Time Limit: 8000MS Memory Limit: 262144K Total Submissions: 33435 Accepted: 111 ...
- POJ 1511 Invitation Cards (最短路的两种方法spfa, Dij)
题意: 给定n个点, m条路, 求1到 2 ~n的最短路之和加上2~n到1的最短路之和 分析: 裸最短路, 求其他点到源点的距离只需要把边方向再从源点求一次即可 spfa代码 #include< ...
- 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)
Invitation Cards Time Limit: 8000MS Memory Limit: 262144K Total Submissions: 16178 Accepted: 526 ...
- POJ 1511 - Invitation Cards 邻接表 Dijkstra堆优化
昨天的题太水了,堆优化跑的不爽,今天换了一个题,1000000个点,1000000条边= = 试一试邻接表 写的过程中遇到了一些问题,由于习惯于把数据结构封装在 struct 里,结果 int [10 ...
随机推荐
- iOS保持流畅有哪些秘诀? 除了黑科技GPU还有这些重要原因 期待安卓8.0流畅度逆袭
经常有人提起iPhone使用起来要比Android手机流畅,现在谈谈为什么iOS使用中会让人觉得更加流畅一些.一方面iPhone的顶级硬件为iOS的流畅打好了基础,另一方面,专一定制的系统是保证体验的 ...
- 动态库连接器–动态库链接信息(Mach-O文件格式和程序从加载到执行过程)
section cmd 说明 举例 __text 主程序代码 __stubs 用于动态库链接的桩 __stub_helper 用于动态库链接的桩 __cstring 常亮字符串符号表描述信 ...
- 第二章 Python数据类型详解
基本概念 迭代(iteration):如果给定一个list或tuple,我们可以通过for循环来遍历,这种遍历我们称为迭代(iteration) 可变:value改变,id不变,可变类型是不可hash ...
- Java从入门到精通一步到位!
Java作为近几年来非常火的编程语言,转行来做Java的人不计其数,但如今真正的人才仍然匮乏,所以学习Java一定要有一个系统的学习规划课程.阿里云大学帮您规划Java学习路线可以帮助您从一个小白成长 ...
- [BOI2007]摩基亚
题目:洛谷P4390.BZOJ1176. 题目大意: 给你一个\(W\times W\)的矩阵,初始每个数都为\(S\).现在有若干操作: 1. 给某个格子加上一个值:2. 询问某个子矩阵的值的和:3 ...
- POI 详细介绍
Apache POI是一个开源的Java读写Excel.WORD等微软OLE2组件文档的项目.目前POI已经有了Ruby版本. 结构: HSSF - 提供读写Microsoft Excel XLS格式 ...
- [terry笔记]Oracle SQL 优化之sql tuning advisor (STA)
前言:经常可以碰到优化sql的需求,开发人员直接扔过来一个SQL让DBA优化,然后怎么办? 当然,经验丰富的DBA可以从各种方向下手,有时通过建立正确索引即可获得很好的优化效果,但是那些复杂SQL错综 ...
- android启动第一个界面时即闪屏的核心代码(两种方式)
闪屏,就是SplashScreen,也能够说是启动画面,就是启动的时候,闪(展示)一下,持续数秒后.自己主动关闭. 第一种方式: android的实现很easy,使用Handler对象的postDe ...
- Webstorm快捷键整理
Webstorm快捷键整理 F2/Shift F2 下一个/上一个高亮错误 Ctrl+Shift+BackSpace 回到刚刚编辑的地方 Alt+Insert 新建文件,还有其他功能 Ctrl+D ...
- SQL编码中注意的性能问题
1.选择合适的数据类型 为列选择最小化的数据类型 假设一列中的文本长度不一,使用VARCHAR而不是CHAR 不存储Unicode不要使用NVARCHAR或者NCHAR 假设一行的长度不超过8000, ...