POJ1511

问你从1到其它点得所有最短路之和  与  其他点到1得所有最短路之和 得总和

思路很明确就是两次最短路,翻转一次地图就好了

一开始就是两次spfa之间处理好数据得更新管理就好

vector结构体数组存储边得数据

dis存储最短路径

vis表示i是否在队列中

id与cnt来链式前向星

需要仔细考虑得不仅仅是spfa算法了,而是开头和中间得跟新优化处理,该初始化的得初始化,初始化成什么值还得清楚

所以后来我就想用引用和数组指针来做,觉得得快一点吧,因为我用空间换了时间,新一个reedge

vector结构体数组,在输入的时候存储反向边,对应的还有reid,recnt

初始化方面不用考虑太多了,需要做的就是函数得参数多了,而这没什么麻烦得

一开始得code

#include <iostream>
#include <queue>
#include <string.h>
#include <vector>
#include <cstdio>
#define inf 0x3f3f3f3f
using namespace std;
const int maxn = 1e6 + 1e2;
struct node
{
int to,cost,pre;
node(int t,int c,int p):to(t),cost(c),pre(p){}
node(){}
};
vector<node> edge;
queue<int>q;
int dis[maxn];
int vis[maxn];
int line[maxn][3];
int id[maxn],cnt;
void add(int from,int to,int cost)
{
edge.push_back(node(to,cost,id[from]));
id[from] = cnt++;
}
void init(int n)
{
for(int i = 1;i <= n;i++)
{
dis[i] = inf;
vis[i] = 0;
}
edge.clear();
cnt = 0;
memset(id,-1,sizeof(id));
}
void spfa(int s,int n)
{
vis[s] = 1,dis[s] = 0;
while(q.size())q.pop();
q.push(s); while(q.size())
{
int now = q.front();q.pop();vis[now] = 0;
for(int i = id[now];~i;i = edge[i].pre)
{
int to = edge[i].to;
int cost = edge[i].cost;
if(dis[to] > dis[now] + cost)
{
dis[to] = dis[now] + cost;
if(!vis[to])
{
q.push(to);
vis[to] = 1;
}
}
}
}
}
int main()
{
int t,n,m;
scanf("%d",&t);
while(t--)
{ scanf("%d%d",&n,&m);
init(n);
int a,b,x;
for(int i = 0;i < m;i++)
{
scanf("%d%d%d",&line[i][0],&line[i][1],&line[i][2]);
add(line[i][0],line[i][1],line[i][2]);
}
spfa(1,n);
long long ans = 0;
for(int i = 1;i <= n;i++)
{
ans += dis[i];
dis[i] = inf;
vis[i] = 0;
}
cnt = 0;
memset(id,-1,sizeof(id));
edge.clear();
for(int i = 0;i < m;i++)
{
add(line[i][1],line[i][0],line[i][2]);
}
spfa(1,n);
for(int i = 1;i <= n;i++)
{
ans += dis[i];
}
printf("%lld\n",ans);
}
return 0;
}

后来的

#include <iostream>
#include <queue>
#include <string.h>
#include <vector>
#include <cstdio>
#define inf 0x3f3f3f3f
using namespace std;
const int maxn = 1e6 + 1e2;
struct node
{
int to,cost,pre;
node(int t,int c,int p):to(t),cost(c),pre(p){}
node(){}
};
vector<node> edge,reedge;
queue<int>q;
int dis[maxn];
int vis[maxn];
int id[maxn],cnt;
int reid[maxn],recnt;
void add(int from,int to,int cost,vector<node> &line,int *p,int &num)
{
line.push_back(node(to,cost,p[from]));
p[from] = num++;
}
void init(int n)
{
for(int i = 1;i <= n;i++)
{
dis[i] = inf;
vis[i] = 0;
}
edge.clear();
reedge.clear();
cnt = 0;
recnt = 0;
memset(id,-1,sizeof(id));
memset(reid,-1,sizeof(reid));
}
void spfa(int s,int n,vector<node> &line,int *p)
{
vis[s] = 1,dis[s] = 0;
while(q.size())q.pop();
q.push(s); while(q.size())
{
int now = q.front();q.pop();vis[now] = 0;
for(int i = p[now];~i;i = line[i].pre)
{
//cout<<i<<endl;
int to = line[i].to;
int cost = line[i].cost;
if(dis[to] > dis[now] + cost)
{
dis[to] = dis[now] + cost;
if(!vis[to])
{
q.push(to);
vis[to] = 1;
}
}
}
}
}
int main()
{
int t,n,m;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
init(n);
int a,b,x;
for(int i = 0;i < m;i++)
{
scanf("%d%d%d",&a,&b,&x);
add(a,b,x,edge,id,cnt);
add(b,a,x,reedge,reid,recnt);
}
spfa(1,n,edge,id); long long ans = 0;
for(int i = 1;i <= n;i++)
{
ans += dis[i];
dis[i] = inf;
vis[i] = 0;
}
spfa(1,n,reedge,reid);
for(int i = 1;i <= n;i++)
{
ans += dis[i];
}
printf("%lld\n",ans);
}
return 0;
}

让我i最不解得是后者竟然没有前者快,而且花了两倍得空间,我觉得可能是引用得问题吧~~其实我也不清楚嘞~

POJ1511来回最短路的更多相关文章

  1. 来回最短路POJ3268

    这个题得主要考点在于给你的图是去了再回来得有向图,如何模块化解决呢就是转变图的方向,我们根据初始得放心求出每个点到x得最短路,然后转变所有路得方向再求出所有点到x得最短路,最后一相加就是最后的来回了~ ...

  2. Uva 10806 来回最短路,不重复,MCMF

    题目链接:https://uva.onlinejudge.org/external/108/10806.pdf 题意:无向图,从1到n来回的最短路,不走重复路. 分析:可以考虑为1到n的流量为2时的最 ...

  3. POJ-3268(来回最短路+dijkstra算法)

    Silver Cow Party POJ-3268 这题也是最短路的模板题,只不过需要进行两次求解最短路,因为涉及到来回的最短路之和. 该题的求解关键是:求解B-A的最短路时,可以看做A是起点,这就和 ...

  4. POJ 2135 Farm Tour &amp;&amp; HDU 2686 Matrix &amp;&amp; HDU 3376 Matrix Again 费用流求来回最短路

    累了就要写题解,近期总是被虐到没脾气. 来回最短路问题貌似也能够用DP来搞.只是拿费用流还是非常方便的. 能够转化成求满流为2 的最小花费.一般做法为拆点,对于 i 拆为2*i 和 2*i+1.然后连 ...

  5. poj1511【最短路spfa】

    题意: 计算从源点1到各点的最短路之和+各点到源点1的最短路之和: 思路: 源点这个好做啊,可是各点到源点,转个弯就是反向建边然后求一下源点到各点的最短路,就是各点到源点的最短路,在两幅图里搞: 贴一 ...

  6. POJ2135 来回最短路(简单费用流)

    题意:       就是从1走到n然后再走回来,一条边只能走一次,要求路径最短. 思路:       比较水,可以直接一遍费用流,不解释了,具体的看看代码,敲这个题就是为了练 练手,好久不敲了,怕比赛 ...

  7. 【转】最短路&差分约束题集

    转自:http://blog.csdn.net/shahdza/article/details/7779273 最短路 [HDU] 1548 A strange lift基础最短路(或bfs)★254 ...

  8. kuangbin带你飞 最短路 题解

    求一个图最短路边的办法.好像下面的那个有问题.单向边和双向边一定是有区别的.这个比较容易.参照该文的最短路网络流题目和连通图题目一题求最短路关节边 另外上述2个题目的代码好像有问题. 在UVALIVE ...

  9. 转载 - 最短路&差分约束题集

    出处:http://blog.csdn.net/shahdza/article/details/7779273 最短路 [HDU] 1548    A strange lift基础最短路(或bfs)★ ...

随机推荐

  1. Eclipse出现错误:The selection cannot be launched,and there are no recent launches

    刚装了eclipse,想写个Java程序测试一下能不能用,结果一run就出现错误,Debug也是同样的错误,错误内容为:the selection cannot be launched,and the ...

  2. Hbase—学习笔记(一)

    此文的目的: 1.重点理解Hbase的整体工作机制 2.熟悉编程api,能够用来写程序 1.  什么是HBASE 1.1.   概念特性 HBASE是一个数据库----可以提供数据的实时随机读写 HB ...

  3. Linux下tar.gz 安装

    将安装文件拷贝至你的目录中 如果是以root身份登录上的,就将软件拷贝至/root中. cp xxx.tar.gz /root 解压缩包 tar xvzf xxx.tar.gz 切换到安装目录下 cd ...

  4. java中checked和unchecked 异常处理

    有两种类型的异常:一种是checked异常一种是unchecked异常,在这篇文章中我们将利用实例来学习这两种异常,checked的异常和unchecked异常最大的区别就是checked去唱是在编译 ...

  5. Hibernate使用固定值关联表

    假设表A与表B需要进行一对一关联,表A的a1字段等于表B的a1字段,同时表B中的b2字段需要为某一固定值,可采取如下方式配置: public class A { private String a; @ ...

  6. mysql 导出sql结果成csv文件

    mysql -uroot -p -e "use database;sql语句:" > a.csv 举例: mysql -uroot -p -e "use main; ...

  7. IE6 PNG不透明问题 (只解决img标签的图片)

    <script type='text/javascript' src="/script/ie6.pngfix.js"></script> 会让一些posit ...

  8. vs2010下载Microsoft Visual Studio 2010 Express(vs2010中文版下载)速成官方合集正式版

    http://www.xiazaiba.com/html/1832.html VB.NET 2010 Express: 2KQT8-HV27P-GTTV9-2WBVV-M7X96VC++ 2010 E ...

  9. JS数组去重办法大全

    第一种是比较常规的方法 思路: 1.构建一个新的数组存放结果 2.for循环中每次从原数组中取出一个元素,用这个元素循环与结果数组对比 3.若结果数组中没有该元素,则存到结果数组中 复制代码代码如下: ...

  10. Maven国内镜像-阿里云

    国外的maven下载速度堪忧,大部分国内网络访问都很慢国内的阿里云同样提供了maven的文件镜像使用:1.在maven的setting.xml加入下段代码即可使用阿里云的maven镜像 <mir ...