ACM/ICPC 之 最短路-SPFA+正逆邻接表(POJ1511(ZOJ2008))
求单源最短路到其余各点,然后返回源点的总最短路长,以构造邻接表的方法不同分为两种解法。
POJ1511(ZOJ2008)-Invitation Cards
改变构造邻接表的方法后,分为两种解法
解法一:
//POJ1511-ZOJ2008
//Time:7766Ms Memory:99112K
//求从1处到各点后再返回1处的最短总路长
//需要构造邻接表和逆邻接表
//构造方法1:vector构造邻接表
//SPFA+邻接表
#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#include<queue>
using namespace std; #define MAX 1000005
#define INF 0x3f3f3f3f struct Edge {
int u, w;
Edge(int uu, int ww) :u(uu), w(ww) {}
}; vector<Edge> e1[MAX], e2[MAX]; //邻接表-逆邻接表 int n, m;
int d[MAX];
long long sum;
bool v[MAX]; void SPFA(int x, vector<Edge> e[MAX])
{
memset(d, INF, sizeof(d));
memset(v, false, sizeof(v));
queue<int> q;
q.push(x);
d[x] = ;
while (!q.empty()){
int cur = q.front();
q.pop();
v[cur] = false;
for (int i = ; i < e[cur].size(); i++)
{
int u = e[cur][i].u;
if (d[u] > d[cur] + e[cur][i].w)
{
d[u] = d[cur] + e[cur][i].w;
if (!v[u]) { q.push(u); v[u] = true; }
}
}
}
for (int i = ; i <= n; i++)
sum += d[i];
} int main()
{
int T;
scanf("%d", &T);
while (T--) {
sum = ;
memset(e1, , sizeof(e1));
memset(e2, , sizeof(e2));
scanf("%d%d", &n, &m);
while (m--) {
int u, v, w;
scanf("%d%d%d", &u, &v, &w);
e1[u].push_back(Edge(v, w)); //正向
e2[v].push_back(Edge(u, w)); //逆向
} SPFA(, e1);
SPFA(, e2);
printf("%lld\n", sum);
} return ;
}
解法二:
//POJ1511-ZOJ2008
//Time:2000Ms Memory:36424K
//求从1处到各点后再返回1处的最短总路长
//需要构造邻接表和逆邻接表
//构造方法2:偏序关系构造邻接表
//SPFA+邻接表
#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#include<queue>
using namespace std; #define MAX 1000005
#define INF 0x3f3f3f3f struct Edge {
int u, w, next;
Edge() {}
Edge(int uu, int ww, int nn) :u(uu), w(ww), next(nn) {}
}e1[MAX], e2[MAX]; //邻接表-逆邻接表 int h1[MAX], h2[MAX]; //正表表头-逆表表头
int n, m;
int d[MAX];
long long sum;
bool v[MAX]; void SPFA(int x, Edge e[MAX], int h[MAX])
{
memset(d, INF, sizeof(d));
memset(v, false, sizeof(v));
queue<int> q;
q.push(x);
d[x] = ;
while (!q.empty()){
int cur = q.front();
q.pop();
v[cur] = false;
for (int i = h[cur]; i != -; i = e[i].next)
{
int u = e[i].u;
int w = e[i].w;
if (d[u] > d[cur] + w)
{
d[u] = d[cur] + w;
if (!v[u]) { q.push(u); v[u] = true; }
}
}
}
for (int i = ; i <= n; i++)
sum += d[i];
} int main()
{
int T;
scanf("%d", &T);
while (T--) {
sum = ;
memset(e1, , sizeof(e1));
memset(e2, , sizeof(e2));
memset(h1, -, sizeof(h1));
memset(h2, -, sizeof(h2));
scanf("%d%d", &n, &m);
for (int i = ; i < m; i++) {
int u, v, w;
scanf("%d%d%d", &u, &v, &w);
e1[i] = Edge(v, w, h1[u]);
e2[i] = Edge(u, w, h2[v]);
h1[u] = h2[v] = i;
} SPFA(, e1, h1);
SPFA(, e2, h2);
printf("%lld\n", sum);
} return ;
}
ACM/ICPC 之 最短路-SPFA+正逆邻接表(POJ1511(ZOJ2008))的更多相关文章
- SPFA中 正逆邻接表的建立
正邻接表的建立: 先定义一个结构体: struct node { int r,v,w,next; }Map[]; 每输入一组数据 就通过Add函数加入到邻接表中,上图已经说得很明白了,结合着下面的代码 ...
- HDU 1874 畅通工程续(最短路/spfa Dijkstra 邻接矩阵+邻接表)
题目链接: 传送门 畅通工程续 Time Limit: 1000MS Memory Limit: 65536K Description 某省自从实行了很多年的畅通工程计划后,终于修建了很多路. ...
- ACM/ICPC 之 最短路-Floyd+SPFA(BFS)+DP(ZOJ1232)
这是一道非常好的题目,融合了很多知识点. ZOJ1232-Adventrue of Super Mario 这一题折磨我挺长时间的,不过最后做出来非常开心啊,哇咔咔咔 题意就不累述了,注释有写,难点在 ...
- 2016 ACM/ICPC Asia Regional Qingdao Online 1001/HDU5878 打表二分
I Count Two Three Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
- 最短路径SPFA算法(邻接表存法)
queue <int> Q; void SPFA (int s) { int i, v; for(int i=0; i<=n; i++) dist[i]=INF; //初始化每点i到 ...
- POJ 3013 SPFA算法,邻接表的使用
Big Christmas Tree Time Limit: 3000MS Memory Limit: 131072K Total Submissions: 19029 Accepted: 4 ...
- POJ 3259 Wormholes(最短路&spfa正权回路)题解
题意:给你m条路花费时间(双向正权路径),w个虫洞返回时间(单向负权路径),问你他能不能走一圈回到原点之后,时间倒流. 思路:题意有点难看懂,我们建完边之后找一下是否存在负权回路,存在则能,反之不能. ...
- POJ 1860 Currency Exchange(最短路&spfa正权回路)题解
题意:n种钱,m种汇率转换,若ab汇率p,手续费q,则b=(a-q)*p,你有第s种钱v数量,问你能不能通过转化让你的s种钱变多? 思路:因为过程中可能有负权值,用spfa.求是否有正权回路,dis[ ...
- ACM/ICPC 之 数论-素数筛选法 与 "打表"思路(POJ 1595)
何为"打表"呢,说得简单点就是: 有时候与其重复运行同样的算法得出答案,还不如直接用算法把这组数据所有可能的答案都枚举出来存到一个足够大的容器中去-例如数组(打表),然后再输入数据 ...
随机推荐
- MobClick详解
1.使用自定义事件 使用自定义事件功能请先在网站应用管理后台(设置->编辑自定义事件)中添加相应的自定义事件后,服务器才会对相应的自定义事件请求进行处理.这里我们将提供几个简单而通用的接口: 1 ...
- android-解决EditText的inputType为Password时, 字体不一致的问题
今天做项目的时候,发现当edittext 的InputType为password时,它的字体和原来不一样: 网上找了一下,给出了解决办法: 第一: 去掉xml文件中的password配置,在代码中编写 ...
- Java中的char到底是多少个字节?
貌似一个简单的问题(也许还真是简单的)但是却把曾经自认为弄清楚的我弄得莫名其妙 char在Java中应该是16个字节byte在Java中应该是8个字节char x = '编'; //这样是合法的,输出 ...
- ASP.NET MVC 4 的JS/CSS打包压缩功能-------过滤文件
今天在使用MVC4打包压缩功能@Scripts.Render("~/bundles/jquery") 的时候产生了一些疑惑,问什么在App_Start文件夹下BundleConfi ...
- NUGet的诞生与使用
本文引用地址:http://msdn.microsoft.com/zh-cn/magazine/hh547106.aspx NuGet 使用 NuGet 管理项目库 Phil Haack 无论多么努力 ...
- AngularJS API之copy深拷贝
angular提供了一个可以复制对象的api--copy(source,destination),它会对source对象执行深拷贝. 使用时需要注意下面几点: 如果只有一个参数(没有指定拷贝的对象), ...
- Ubuntu 14 如何打开 .chm格式文档?
好多手册是.chm格式,Ubuntu是需要安装第三方软件才能打开.chm格式文档,操作方式如下: 到“软件中心” -> 搜索“xchm”,并安装 -> 右键某个.chm文档,选择“属性” ...
- PHP协程 详解
[开源中国] PHP 使用协同程序实现合作多任务 [风雪之隅] 在PHP中使用协程实现多任务调度
- InnoDB锁机制分析
InnoDB锁机制常常困扰大家,不同的条件下往往表现出不同的锁竞争,在实际工作中经常要分析各种锁超时.死锁的问题.本文通过不同条件下的实验,利用InnoDB系统给出的各种信息,分析了锁的工作机制.通过 ...
- Hello 畅连·西瓜 帮助与更新
无感认证很好用,软件不再更新, 感谢每一位朋友的陪伴,谢谢! (2016.12.15) 百度云:点击下载 ------------旧版更新日志------------- Hello 畅连·西瓜 官网: ...