题很简单 就是有向图中求给出的源点到其余所有点的最短路的和与其余所有点到源点的最短路之和

一开始以为dij对于正权图的单源最短路是最快的 写了一发邻接表的dij 结果超时 把所有的cin改成scanf 还是超时(过去并没有用cin的坏习惯..近两个星期才开始疯狂的使用cin..因为懒..)

后来想了一下 spfa也可以求单源最短路 就试着写了一发scanf 然后wa...看了半天题目 发现是有很大可能爆int的 改了后1800+msAC 用cin仍然超时

所以cin害人不浅 scanf大法好23333333

咨询了一下学长 学长给出来一个看似很有道理的解答:dij与bel都是直接在所有直接相连的点或者是所有直接相连的边里选最优 spfa是bell的优化 所以一定程度上也是对dij的优化 spfa讲道理是可以适合两个版本的

自己思考了一下 dij是耿直的尝试更新 spfa是如果可以松弛就放入队列 于是同一个点避开了多次的尝试作为终点更新 大概是这样吧...稀疏图应该是dij更快把..

至于为什么不写堆优化的dij呢?当然是我不会了23333333333333333333333

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<map>
#include<math.h>
#include<queue>
#include<iostream>
using namespace std;
int n,m;
int t1,t2;
struct node
{
int v;
long long w;
int nex;
};
node a[1000050];
node b[1000050];
int p1[1000050];
int p2[1000050];
void add1(int u,int v,long long w) /// real
{
a[t1].v=v;
a[t1].w=w;
a[t1].nex=p1[u];
p1[u]=t1;
t1++;
}
void add2(int u,int v,long long w) /// un
{
b[t2].v=v;
b[t2].w=w;
b[t2].nex=p2[u];
p2[u]=t2;
t2++;
}
long long dis1[1000050];
long long dis2[1000050];
bool vis[1000050];
void spfa1(){
queue<int >q;
q.push(1);
vis[1]=false;
while(!q.empty()){
int u=q.front();q.pop();
vis[u]=true;
for(int tt=p1[u];tt!=-1;tt=a[tt].nex)
{
int v=a[tt].v;
int w=a[tt].w;
if(dis1[u]+w<dis1[v])
{
dis1[v]=dis1[u]+w;
if(vis[v])
{
vis[v]=false;
q.push(v);
}
}
}
}
}
void spfa2(){
queue<int >q;
q.push(1);
vis[1]=false;
while(!q.empty()){
int u=q.front();q.pop();
vis[u]=true;
for(int tt=p2[u];tt!=-1;tt=b[tt].nex)
{
int v=b[tt].v;
int w=b[tt].w;
if(dis2[u]+w<dis2[v])
{
dis2[v]=dis2[u]+w;
if(vis[v])
{
vis[v]=false;
q.push(v);
}
}
}
}
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
for(int i=1; i<=n; i++)
dis1[i]=dis2[i]=999999999999999;
dis1[1]=0;
dis2[1]=0;
for(int i=1; i<=n; i++)
vis[i]=true;
for(int i=1; i<=n; i++)
{
p1[i]=p2[i]=-1;
}
t1=t2=0;
for(int i=1; i<=m; i++)
{
int u,v;
long long w;
scanf("%d%d%I64d",&u,&v,&w);
add1(u,v,w);
add2(v,u,w);
}
spfa1();
for(int i=1; i<=n; i++)
vis[i]=true;
spfa2();
long long ans=0;
for(int i=2;i<=n;i++)
{
ans+=dis1[i];
ans+=dis2[i];
}
printf("%I64d\n",ans);
}
}

  

POJ 1511 最短路spfa的更多相关文章

  1. poj 1511 Invitation Cards spfa 邻接矩阵

    题目链接: http://poj.org/problem?id=1511 题目大意: 这道题目比较难理解,我读了好长时间,最后还是在队友的帮助下理解了题意,大意就是,以一为起点,求从一到其他各点的最短 ...

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

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

  3. POJ - 1511 - 两次SPFA

    这道题也算是一道模板题,但是第一次用优先队列迪杰斯特拉就T了.1e6的数据量,给了8s,网上其他题解中说要用SPFA. 题意:N个点的带权有向图.每次都从1出发,要到达其余没有被访问过的一个点(发传单 ...

  4. poj 3013 最短路SPFA算法

    POJ_3013_最短路 Big Christmas Tree Time Limit: 3000MS   Memory Limit: 131072K Total Submissions: 23630 ...

  5. Poj 1511 Invitation Cards(spfa)

    Invitation Cards Time Limit: 8000MS Memory Limit: 262144K Total Submissions: 24460 Accepted: 8091 De ...

  6. POJ 3159 最短路 SPFA

    #include<iostream> using namespace std; const int nMax = 30005; const int mMax = 150005; const ...

  7. It&#39;s not a Bug, It&#39;s a Feature! (poj 1482 最短路SPFA+隐式图+位运算)

    Language: Default It's not a Bug, It's a Feature! Time Limit: 5000MS   Memory Limit: 30000K Total Su ...

  8. DIjkstra(反向边) POJ 3268 Silver Cow Party || POJ 1511 Invitation Cards

    题目传送门 1 2 题意:有向图,所有点先走到x点,在从x点返回,问其中最大的某点最短路程 分析:对图正反都跑一次最短路,开两个数组记录x到其余点的距离,这样就能求出来的最短路以及回去的最短路. PO ...

  9. HDU 1535 Invitation Cards (POJ 1511)

    两次SPFA. 求 来 和 回 的最短路之和. 用Dijkstra+邻接矩阵确实好写+方便交换.可是这个有1000000个点.矩阵开不了. d1[]为 1~N 的最短路. 将全部边的 邻点 交换. d ...

随机推荐

  1. Android Handler leak 分析及解决办法

    In Android, Handler classes should be static or leaks might occur, Messages enqueued on the applicat ...

  2. git_2-linux

    在linux下搭建git环境1.创建Github账号,https://github.com2.Linux创建SSH密钥: ssh-keygen  ##一直默认就可以了 3.将公钥加入到Github账户 ...

  3. 使用MySQL索引的几个问题

    1.索引不存储null值 更准确的说,单列索引不存储null值,复合索引不存储全为null的值.索引不能存储Null,所以对这列采用is null条件时,因为索引上根本 没Null值,不能利用到索引, ...

  4. ytu 1940:Palindromes _easy version(水题)

    Palindromes _easy version Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 47  Solved: 27[Submit][Statu ...

  5. html select 下拉箭头隐藏

    html select 下拉箭头隐藏 <!DOCTYPE html> <html> <head lang="en"> <meta char ...

  6. js:语言精髓笔记12--动态语言特性(2)

    对于括号内: 通过赋值时发生的重写: (Object1 = function() {}).prototype.value = 100; var obj1 = new Object1; console. ...

  7. JavaScript中两个感叹号(!!)的作用是什么?

    !!一般用来将后面的表达式强制转换为布尔类型的数据(boolean),也就是只能是true或者false. 看这么个例子: var a: var b=!!a; a默认是undefined.!a是tru ...

  8. Chart系列(一):Chart的基本元素

    如何使用一个Chart,则首先必须要了解其组织结构,其次知道其API. Chart元素 首先,来看看Chart组成元素. Axis Label:坐标轴标签   Axis Title:坐标轴标题   C ...

  9. html加强

    <html> <head><title>hello</title></head> <body> <p>段落</ ...

  10. win7中资源管理器不能显示图片预览的解决方法

    在用xp的时候,在资源管理器里面预览图片文件是在普通不过的事情了.换到win7之后,图片文件一直不能预览,只是显示图标还挺烦的.肯定是哪里设置的不对,下午闲来无事,找到是哪里的问题了. 如果你也遇到相 ...