今天听说vector不开o2是数组时间复杂度常数的1.5倍,瞬间吓傻。然后就问好的图表达方式,然后看到了链式前向星。于是就写了一段链式前向星+SPFA的,和普通的vector+SPFA的对拍了下,速度不错。

参考文章:http://malash.me/200910/linked-forward-star/

(百科 链式前向星 也有的)

适用于: 稠密图的表示

我们定义:

//MAXN表示最大节点数,MAXE表示最大边数

int head[MAXN],       //head[i]表示以i作为起点所对应边中的最后一条边的位置
v[MAXE],              //v[i]表示第i条边的终点
next[MAXE],        //next[i]表示边i之前的以同样起点的边的地址
w[MAXE];            //边的权值

实现:

#include <iostream>
#include <algorithm>
#include <queue>
#include <cstring>
using namespace std;
const int MAXE = 10000,
MAXN = 10000,
INF = 1000000000;
int e, n, a, b, c; int head[MAXN], //存起始位置
v[MAXE], //边的终点
next[MAXE], //下一条边地址
w[MAXE], //权值
d[MAXN]; queue<int> q;
bool vis[MAXN];
void spfa(int root)
{
memset(vis, 0, sizeof(vis));
for(int i = 1; i <= n; i++) d[i] = INF;
d[root] = 0;
q.push(root);
int t, i;
while(!q.empty())
{
t = q.front(); q.pop();
i = head[t];
while(i)
{
if(d[v[i]] > d[t]+w[i])
{
d[v[i]] = d[t] + w[i];
if(!vis[v[i]])
{
vis[v[i]] = 1;
q.push(v[i]);
}
}
i = next[i];
}
vis[t] = 0;
} } int main()
{
cin >> n >> e;
for(int i = 1; i <= e; i++)
{
cin >> b >> v[i] >> w[i];
next[i] = head[b]; //指向同起点的上一条边
head[b] = i; //更新b指向的最后一条边位置
}
cin >> a;
for(int i = 0; i < a; i++)
{
cin >> b >> c;
spfa(b);
if(d[c] == INF) cout << "No Answer!\n";
else cout << d[c] << endl;
}
return 0;
}

链式前向星+SPFA的更多相关文章

  1. 【模板】链式前向星+spfa

    洛谷传送门--分糖果 博客--链式前向星 团队中一道题,数据很大,只能用链式前向星存储,spfa求单源最短路. 可做模板. #include <cstdio> #include <q ...

  2. POJ 3169 Layout(差分约束+链式前向星+SPFA)

    描述 Like everyone else, cows like to stand close to their friends when queuing for feed. FJ has N (2 ...

  3. POJ 1511 Invitation Cards 链式前向星+spfa+反向建边

    Invitation Cards Time Limit: 8000MS   Memory Limit: 262144K Total Submissions: 27200   Accepted: 902 ...

  4. 洛谷 P3371 【模板】单源最短路径 【链式前向星+SPFA】

    题目描述 如题,给出一个有向图,请输出从某一点出发到所有点的最短路径长度. 输入输出格式 输入格式: 第一行包含三个整数N.M.S,分别表示点的个数.有向边的个数.出发点的编号. 接下来M行每行包含三 ...

  5. POJ 1511 链式前向星+SPFA

    #include<iostream> #include<cstdio> #include<cstdlib> using namespace std; const i ...

  6. 单元最短路径算法模板汇总(Dijkstra, BF,SPFA),附链式前向星模板

    一:dijkstra算法时间复杂度,用优先级队列优化的话,O((M+N)logN)求单源最短路径,要求所有边的权值非负.若图中出现权值为负的边,Dijkstra算法就会失效,求出的最短路径就可能是错的 ...

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

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

  8. 最短路 spfa 算法 && 链式前向星存图

    推荐博客  https://i.cnblogs.com/EditPosts.aspx?opt=1 http://blog.csdn.net/mcdonnell_douglas/article/deta ...

  9. UESTC 30.最短路-最短路(Floyd or Spfa(链式前向星存图))

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

随机推荐

  1. 【JAVA 其它流对象】

    一.PrintStream类. 该流是字节流. public class PrintStream extends FilterOutputStream implements Appendable, C ...

  2. 获取Windows下某进程监听的TCP/UDP端口

    1.在Windows下用CMD netstat命令可以获得当前进程监听端口号的信息,如netstat -ano可以看到IP.port.状态和监听的PID. 那么可以执行CMD这个进程得到监听的端口号信 ...

  3. oracle本机登录不上dba的权限不足错误

    说明:因遇到“sqlplus / as sysdba”登录oracle时遇到权限不足(ora-01031)错误:百度到以下资料,原文链接: http://www.xifenfei.com/2011/1 ...

  4. How to AC it

    旋转卡壳 DP,网络流

  5. flex_高度补全

    一个高度为100px, 另外一个高度自动补全当前界面下剩余的高度: <!DOCTYPE html> <html lang="en"> <head> ...

  6. DOM、Window对象操作

    一.DOM的基本概念 DOM是文档对象模型,这种模型为树模型:文档是指标签文档:对象是指文档中每个元素:模型是指抽象化的东西. 一.基本语法: 数据类型(字符串,小数,整数,布尔,时间) var, v ...

  7. 关闭Android/iPhone浏览器自动识别数字为电话号码

    <meta name="format-detection" content="telephone=no"><meta http-equiv=& ...

  8. css整理-06 表和列表

    表格式化 表布局 table, display:table caption, display: table-caption thead, display: table-header-group tbo ...

  9. 移动网站中,用canvas,svg比用图片好?

    1.Svg可以单独作为文件打开,在AI里做矢量图形,保存图层路径,即可另存为Svg文件. (1) Path语法:命令+参数.大写字母表示坐标参数为绝对位置,小写字母表示坐标参数为相对位置(即上次画笔结 ...

  10. zepto下加载openbox弹出层

    function fnOpenBox(objId,animateD,speed,tween,hide){ var oOpenBox = $(objId); oOpenBox.show(); oOpen ...