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 ... 
随机推荐
- swift使用查阅资料备份1
			SnapKit RxSwift R.swift https://www.jianshu.com/p/68e12b966d86 iOS - RxSwift 项目实战记录 https://blog.csd ... 
- GFM(GitHub Flavored Markdown)与标准Markdown的语法区别
			没有就自己造 其实这篇文16年底的时候就写好的,只不过当时是记在自己的笔记上(没错,我笔记大多记在本地,比发表的这寥寥几篇那是多的多的多了 
- Error running Tomcat 6: Address localhost:8080 is already in use
			错误原因:8080端口被其他的应用占用!解决方案:第一步,命令提示符号,执行命令:netstat –anoActive ConnectionsProto Local Address ... 
- Pyhton学习——Day31
			# 服务端和接收端的send和reve没有任何关系,只与协议之间有关系# 应用程序产生的数据一定会交给操作系统,并由操作系统往外发送# 发送端什么时候会清空自己的内存?# 收到接收端的ACK响应以后才 ... 
- 加减法计算器-java
			由于经常进行较大数据的加减法计算,好多计算器都是转换成科学技术法的,所以自己用java写了一个 功能如下: 1,可以输入多个带千位分隔符的数字,进行加减法计算 2,结果展示带千位分隔符 3,结果展示不 ... 
- FZU 1692 Key problem( 循环矩阵优化 + 矩阵快速幂)
			链接:传送门 题意: n个小朋友围成一个环( 2 <= n <= 100 )然后进行m次的游戏. 一开始,第 i 个小朋友有 Ai 个苹果. 定义游戏的规则为:每一次游戏处于 i 位置的小 ... 
- HDU 6149 Valley Numer II (状压DP 易错题)
			题目大意:给你一个无向连通图(n<=30),点分为高点和低点,高点数量<=15,如果两个高点和低点都直接连边,那么我们称这三个点形成一个valley,每个点最多作为一个valley的组成部 ... 
- Laravel源码解析之反射的使用
			前言 PHP的反射类与实例化对象作用相反,实例化是调用封装类中的方法.成员,而反射类则是拆封类中的所有方法.成员变量,并包括私有方法等.就如"解刨"一样,我们可以调用任何关键字修饰 ... 
- 小学生都能学会的python(编码 and 字符串)
			小学生都能学会的python(编码 and 字符串) 一,编码 最早的计算机编码是ASCII. 有英文+数字+特殊字符 8bit => 1byte 没有中文, 后面的编码必须兼容ASCII ... 
- 解决locate无法使用的问题
			使用yum安装,locate的安装包名为mlocate 安装: yum -y install mlocate 更新: updatedb 无法使用:先下载 
