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

一开始以为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 UI] Shape详解 (GradientDrawable)

    转载自:http://blog.csdn.net/feng88724/article/details/6398193 在Android开发过程中,经常需要改变控件的默认样式, 那么通常会使用多个图片来 ...

  2. decltype

    在C++中,decltype作为操作符,用于查询表达式的数据类型.decltype在C++11标准制定时引入,主要是为泛型编程而设计,以解决泛型编程中,由于有些类型由模板参数决定,而难以(甚至不可能) ...

  3. hadoop的关键进程

    hadoop集群中主要进程有master:   NameNode, ResourceManager,slaves:   DataNode, NodeManager,  RunJar, MRAppMas ...

  4. jar包和war包的区别

    jar包和war包的区别: jar包就是别人已经写好的一些类,然后将这些类进行打包,你可以将这些jar包引入你的项目中,然后就可以直接使用这些jar包中的类和属性了,这些jar包一般都会放在lib目录 ...

  5. Intent的七大属性

    1.Action Action属性代表系统要执行的动作 系统提供如下常用的Action属性 *ACTION_MAIN:应用程序入口点 *ACTION_VIEW:显示指定数据 *ACTION_EDIT: ...

  6. 【转】apache kafka技术分享系列(目录索引)

    转自:  http://blog.csdn.net/lizhitao/article/details/39499283   估计大神会不定期更新,所以还是访问这个链接看最新的目录list比较好 apa ...

  7. CodeForces 656B

    C - C Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status ...

  8. JNI NDK开发Crash错误定位 调试

    总结: 搜索backtrace  然后: $ /d/android-ndk-r10c/toolchains/arm-linux-androideabi-4.9/prebuilt/windows-x86 ...

  9. DFS HDOJ 2614 Beat

    题目传送门 /* 题意:处理完i问题后去处理j问题,要满足a[i][j] <= a[j][k],问最多能有多少问题可以解决 DFS简单题:以每次处理的问题作为过程(即行数),最多能解决n个问题, ...

  10. HDU3987 Harry Potter and the Forbidden Forest(边数最少的最小割)

    方法1:两遍最大流.一遍最大流后,把满流边容量+1,非满流边改为INF:再求最小割即为答案. 我大概想了下证明:能构成最小割的边在第一次跑最大流时都满流,然后按那样改变边容量再求一次最小割,就相当于再 ...