POJ 1511 最短路spfa
题很简单 就是有向图中求给出的源点到其余所有点的最短路的和与其余所有点到源点的最短路之和
一开始以为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的更多相关文章
- poj 1511 Invitation Cards spfa 邻接矩阵
题目链接: http://poj.org/problem?id=1511 题目大意: 这道题目比较难理解,我读了好长时间,最后还是在队友的帮助下理解了题意,大意就是,以一为起点,求从一到其他各点的最短 ...
- POJ 1511 Invitation Cards (spfa的邻接表)
Invitation Cards Time Limit : 16000/8000ms (Java/Other) Memory Limit : 524288/262144K (Java/Other) ...
- POJ - 1511 - 两次SPFA
这道题也算是一道模板题,但是第一次用优先队列迪杰斯特拉就T了.1e6的数据量,给了8s,网上其他题解中说要用SPFA. 题意:N个点的带权有向图.每次都从1出发,要到达其余没有被访问过的一个点(发传单 ...
- poj 3013 最短路SPFA算法
POJ_3013_最短路 Big Christmas Tree Time Limit: 3000MS Memory Limit: 131072K Total Submissions: 23630 ...
- Poj 1511 Invitation Cards(spfa)
Invitation Cards Time Limit: 8000MS Memory Limit: 262144K Total Submissions: 24460 Accepted: 8091 De ...
- POJ 3159 最短路 SPFA
#include<iostream> using namespace std; const int nMax = 30005; const int mMax = 150005; const ...
- It's not a Bug, It'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 ...
- DIjkstra(反向边) POJ 3268 Silver Cow Party || POJ 1511 Invitation Cards
题目传送门 1 2 题意:有向图,所有点先走到x点,在从x点返回,问其中最大的某点最短路程 分析:对图正反都跑一次最短路,开两个数组记录x到其余点的距离,这样就能求出来的最短路以及回去的最短路. PO ...
- HDU 1535 Invitation Cards (POJ 1511)
两次SPFA. 求 来 和 回 的最短路之和. 用Dijkstra+邻接矩阵确实好写+方便交换.可是这个有1000000个点.矩阵开不了. d1[]为 1~N 的最短路. 将全部边的 邻点 交换. d ...
随机推荐
- Session入门
Session是运行在服务器的,不可造假,例如:医生需要一个私人账本,记录病人编号和身份的对应关系.由于身份证无法造假,所以能够保证信息不被假冒.两点:身份证无法造假,这个身份证就可以唯一标识这个用户 ...
- 源码安装mysql-5.6.32.tar.gz
http://mirrors.sohu.com/mysql/MySQL-5.6/mysql-5.6.32.tar.gz 安装依赖包: #yum install wget bison gcc gcc-c ...
- 用PHP实现定时器功能
1.直接使用PHP来完成定时 <?php ignore_user_abort(false);//当用户关闭页面时服务停止 set_time_limit(0); //设置执行时间,单位是秒.0表示 ...
- 让Entity Framework支持MySql数据库(转载)
转载地址:http://www.cnblogs.com/wintersun/archive/2010/12/12/1903861.html Entity Framework 4.0 也可以支持大名鼎鼎 ...
- ytu 2002:C语言实验——单词统计(水题)
C语言实验——单词统计 Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 61 Solved: 34[Submit][Status][Web Board] ...
- linux tricks 之 BUILD_BUG_ON_ZERO.
------------------------------------------- 本文系作者原创, 欢迎大家转载! 转载请注明出处:netwalker.blog.chinaunix.net -- ...
- laravel 安装及入门
Composer安装过程 一.安装Composer 首先你需要安装Composer,Composer是PHP依赖管理工具,Laravel框架就是使用 Composer 执行安装和依赖管理. 注: ( ...
- 操作SQLite数据库
本文摘自: http://docs.blackberry.com/en/developers/deliverables/25108/Creating_and_deleting_SQLite_datab ...
- python list append方法
keyValueResult = {'a': 1, 'b': 2} sendData = [] def set_push_format(ip): data_format = { "endpo ...
- LightOJ1079 Just another Robbery(DP)
题目大概是抢劫银行,每家银行都有一个收益和一个被抓的概率,求在被抓概率小于P的条件下能获得的最大收益. dp[i][j]表示抢劫前i家银行收益为j被抓的最小概率 dp[0][0]=0 dp[i][j] ...