题目链接:https://cn.vjudge.net/problem/POJ-1511

题意

给出一个图

求从节点1到任意节点的往返路程和

思路

没有考虑稀疏图,上手给了一个Dijsktra(按紫书上的存边方法)

直接超时

写了一个极限大小数据

发现读入时间很长,Dij时间也很长,相当于超时超到姥姥家了

赶紧做优化

  • 发现稀疏图,于是换Bellman(spfa)
  • 换邻接表
  • (虽然没有必要)scanf换成getchar输入模版,大量数据可以节省大概800ms的样子
  1. 稀疏图适用Bellman(optimed),稠密图适用Dijsktra
  2. 对大数据(maxn>1e6),一定要用邻接表
  3. 对大数据(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 往返最短路 邻接表 大量数据下的处理方法的更多相关文章

  1. POJ 1511 Invitation Cards(Dijkstra(优先队列)+SPFA(邻接表优化))

    题目链接:http://poj.org/problem?id=1511 题目大意:给你n个点,m条边(1<=n<=m<=1e6),每条边长度不超过1e9.问你从起点到各个点以及从各个 ...

  2. POJ 1511 Invitation Cards (最短路spfa)

    Invitation Cards 题目链接: http://acm.hust.edu.cn/vjudge/contest/122685#problem/J Description In the age ...

  3. poj 1511 Invitation Cards(最短路中等题)

    In the age of television, not many people attend theater performances. Antique Comedians of Malidine ...

  4. poj 1511 Invitation Cards (最短路)

    Invitation Cards Time Limit: 8000MS   Memory Limit: 262144K Total Submissions: 33435   Accepted: 111 ...

  5. POJ 1511 Invitation Cards (最短路的两种方法spfa, Dij)

    题意: 给定n个点, m条路, 求1到 2 ~n的最短路之和加上2~n到1的最短路之和 分析: 裸最短路, 求其他点到源点的距离只需要把边方向再从源点求一次即可 spfa代码 #include< ...

  6. 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 / ...

  7. POJ 1511 Invitation Cards (spfa的邻接表)

    Invitation Cards Time Limit : 16000/8000ms (Java/Other)   Memory Limit : 524288/262144K (Java/Other) ...

  8. POJ 1511 Invitation Cards(单源最短路,优先队列优化的Dijkstra)

    Invitation Cards Time Limit: 8000MS   Memory Limit: 262144K Total Submissions: 16178   Accepted: 526 ...

  9. POJ 1511 - Invitation Cards 邻接表 Dijkstra堆优化

    昨天的题太水了,堆优化跑的不爽,今天换了一个题,1000000个点,1000000条边= = 试一试邻接表 写的过程中遇到了一些问题,由于习惯于把数据结构封装在 struct 里,结果 int [10 ...

随机推荐

  1. 基于vue项目的js工具方法汇总

    以下是个人过去一年在vue项目的开发过程中经常会用到的一些公共方法,在此进行汇总,方便以后及有需要的朋友查看~ let util = {}; /** * @description 日期格式化 * @p ...

  2. 第十三章 Python并发编程

    并发编程之多进程 python中如果想要充分的利用多核CPU的资源,大部分情况需要使用多进程,python提供了multiprocessing multiprocessing模块用来开启子进程,并在子 ...

  3. Pyhton学习——Day4

    '''y=2*x+1x=3y->7x=3y->7'''# def test(x):# '''# 2*x+1# :param x:整形数字# :return: 返回计算结果# '''# y= ...

  4. laravel save() 返回 null

    原因:引用其他方法时,没有 return save()的操作结果. 在使用save()方法时,发现返回值是:null:

  5. nefu 84 ( 拓展欧几里德模板题 )

    链接:传送门 思路:拓展欧几里德模板题,设大圣至少翻转 t 次,大圣起始位置为 x ,大圣目标位置为 y + n * s ( 大圣到达目标位置 y 可能需要多圈,所以用 s 来表示圈数 ),因为只能逆 ...

  6. uboot的readme导读

    UBOOT的移植其实并没有想象中的难,这主要归功于众多的工程师已经将常见的平台代码写入了UBOOT,我们所要做的就是一点小小的更改,在网上看了很多相关的移植,也听到有人说其实看了UBOOT的readm ...

  7. python基础知识部分练习大全

    python基础知识部分练习大全   1.执行 Python 脚本的两种方式 答:1.>>python ../pyhton.py 2. >>python.py   #必须在首行 ...

  8. jenkins 安装遇到的坑

                        最后启用安全的时候遇到一点坑,直接写了一个用户上去,没有勾选权限,然后在登录就说没有 overright/等,然后需要修改配置文件conf.xml 在主目录下. ...

  9. WinServer-授权规则

    授权规则: 使用谓词可以限制网站只能使用某一种请求 来自为知笔记(Wiz)

  10. 自己动手写shell命令之more

    unix下more命令的简单实现: #include <stdio.h> #define PAGELEN 24 #define LINELEN 512 int do_more(FILE * ...