【spfa训练】HDU4725 (层级建图)
题目大意:一些节点分布在不同的层上,已知相邻的层可以往来距离为c,在给你一些已知的边,问你点1-n的最短路
分析:越往后做,越觉得最短路的考点已经不是spfa算法还是dijkscar算法了,而是图形的创建,你脑海里既要有他给你描绘出的问题场景图,也要有适应算法而建造的图模型,其实这个题有很多的建图方式,看你怎么想了,只能说我的模型化思想还没有完全好,这个图在我脑子里已经TLE了,看了看别人的题目大意又重整旗鼓模拟了一下~~
就是你把一个层就看做一个点,一开始的输入会告诉你每一个点具体在第几层,你可以标记一下,哪些层出现过(TLE点1:你当然可以不标记,然后给每一个相邻的层建边,但是spfa就会麻烦了,tle,因为很可能你会在没有点的层上乱逛)
for(int i = 1;i <= n;i++)
{
scanf("%d",&flor[i]);//i点在l层
vis[flor[i]] = 1;
}
for(int i = 1;i < n;i++)
{
if(vis[i] && vis[i + 1])
{
add(i + n,i + n + 1,c);
add(i + n + 1,i + n,c);
}
}
层层间的路建好了,就剩下点和层的了,(TLE点2:一般都会想的是,把点和它所在的层一一连接起来就好了也就是i 和 n + flor[i]),其实这是一条比较费的路,只会徒增加时间,要知道spfa的队列限制了它一步一步更新最短路,所以你的结点越多,也就会越慢,所以直接跨越一个结点,连接i和i层所在的上下层
剩下的就真的是默写spfa了
#include <iostream>
#include <queue>
#include <cstdio>
#include <string.h>
#include <vector>
#define inf 0x3f3f3f3f
using namespace std;
const int maxn = 3e5 + 3e2; struct node
{
int to,cost,pre;
// node(int t,int c,int p):to(t),cost(c),pre(p){}
}edge[maxn * 10];
//vector<node> edge[maxn];
int n;
int d[maxn];
int vis[maxn];
int id[maxn];
int cnt;int flor[maxn];
queue<int>q;
void init()
{
// memset(vis,0,sizeof(vis));
// memset(id,-1,sizeof(id));
for(int i = 1;i <= 3*n;i++)
{
// edge[i].clear();
d[i] = inf;
vis[i] = 0;
id[i] = -1;
}
memset(flor,0,sizeof(flor));
cnt = 0;
while(!q.empty())q.pop();
}
void add(int from,int to,int cost)
{
// edge[from].push_back(node(to,cost));
edge[cnt].to = to;
edge[cnt].cost = cost;
edge[cnt].pre = id[from];
id[from] = cnt++;
}
void spfa(int s)
{
memset(vis,0,sizeof(vis));
d[s] = 0;
vis[s] = 1;
q.push(s);
while(q.size())
{
int now = q.front();q.pop();vis[now] = 0;
// for(int i = 0;i < edge[now].size();i++)
for(int i = id[now];~i;i = edge[i].pre)
{
// cout<<i<<endl;
// int to = edge[now][i].to;
// int cost = edge[now][i].cost;
int to = edge[i].to;
int cost = edge[i].cost;
if(d[to] > d[now] + cost)
{
d[to] = d[now] + cost;
if(!vis[to])
{
vis[to] = 1;
q.push(to);
}
}
}
}
} int main()
{
int t,m,c,a,b,x;
scanf("%d",&t);
int cas = 1;
while(t--)
{
scanf("%d%d%d",&n,&m,&c);
init();
for(int i = 1;i <= n;i++)
{
scanf("%d",&flor[i]);//i点在l层
vis[flor[i]] = 1;
}
for(int i = 1;i < n;i++)
{
if(vis[i] && vis[i + 1])
{
add(i + n,i + n + 1,c);
add(i + n + 1,i + n,c);
}
}
for(int i = 1;i <= n;i++)
{
add(n + flor[i],i,0);
if(flor[i] > 1)
add(i,n + flor[i] - 1,c);
if(flor[i] < n)
add(i,n + flor[i] + 1,c);
}
while(m--)
{
scanf("%d%d%d",&a,&b,&x);
add(a,b,x);
add(b,a,x);
}
spfa(1);
if(d[n] == inf)d[n] = -1;
printf("Case #%d: %d\n",cas++,d[n]);
}
return 0;
}
WA了11次!思路很重要~!
【spfa训练】HDU4725 (层级建图)的更多相关文章
- 【建图+最短路】Bzoj1001 狼抓兔子
Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个 ...
- UESTC30-最短路-Floyd最短路、spfa+链式前向星建图
最短路 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) 在每年的校赛里,所有进入决赛的同 ...
- The Shortest Path in Nya Graph---hdu4725(spfa+扩点建图)
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=4725 有n个点,每个点都有一个层l[i],相邻层的边有一条无向带权边,权值为都为C,另外 ...
- Invitation Cards(邻接表+逆向建图+SPFA)
Time Limit: 8000MS Memory Limit: 262144K Total Submissions: 17538 Accepted: 5721 Description In ...
- HDU-4725.TheShortestPathinNyaGraph(最短路 + 建图)
本题思路:主要是建图比较麻烦,因为结点可以在层与层之间走动,也可以在边上进行走动,所以主要就是需要找到一个将结点和层统一化处理的方法. 所以我们就可以对于存在边的结点建边,层与层之间如果层数相差一也建 ...
- POJ 1384 Intervals (区间差分约束,根据不等式建图,然后跑spfa)
传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1384 Intervals Time Limit: 10000/5000 MS (Java/Others ...
- HDU 4370 0 or 1(spfa+思维建图+计算最小环)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4370 题目大意:有一个n*n的矩阵Cij(1<=i,j<=n),要找到矩阵Xij(i< ...
- HDU 4725 The Shortest Path in Nya Graph(spfa+虚拟点建图)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4725 题目大意:有n层,n个点分布在这些层上,相邻层的点是可以联通的且距离为c,还有额外给出了m个条边 ...
- NOIP2013 华容道 (棋盘建图+spfa最短路)
#include <cstdio> #include <algorithm> #include <cstring> #include <queue> # ...
随机推荐
- sqlserver解密加密的存储过程(图解)
来自博客:http://www.cnblogs.com/wghao/archive/2012/12/30/2837642.html
- shell脚本通过expect脚本实现自动输入密码(使用expect)
背景:在远程文件下载时,需要输入对方的服务器密码,shell不支持交互输入内容,可以用下面两种方式实现 一.在shell脚本中嵌入expect来实现密码输入 expect是一个自动交互功能的工具. ...
- django通过url传递参数(编辑操作页面)
在做到编辑部分时,想到的办法是在编辑上跳转到页面时给他一个包含唯一标识id的url,然后通过这个url中的id去查询出该条数据,将数据内容显示在编辑页面. 1.编辑按钮 <button on ...
- MongoDB服务无法启动,发生服务特定错误:100
问题:MongoDB服务无法启动,发生服务特定错误:100 原因:没有正常关闭mongod服务,导致mongod被锁 解决方案:进入db文件夹,删除mongod.lock文件,然后重新启动服务即可
- python之三级菜单作业
作业需求如下 1.根据用户的输入打印相应的省.市.县的信息 2.每次只要用户输入b,则返回上一级菜单 3.每次只要用户输入q,则直接退出 4.用户输错需要有提示 homework_dict = {'内 ...
- 岛屿的个数12 · Number of Islands 12
[抄题]: [思维问题]: [一句话思路]: [输入量]:空: 正常情况:特大:特小:程序里处理到的特殊情况:异常情况(不合法不合理的输入): [画图]: [一刷]: [二刷]: [三刷]: [四刷] ...
- Mac 终端便利工具: 管理工具-Homebrew 和提示工具oh my zsh
命令行提示工具 第一步: Homebrew - 安装与使用 https://blog.csdn.net/sir_coding/article/details/77509602 Homebrew安装问题 ...
- db2 快照 SNAPSHOT
打开和关闭快照缺省情况不打开 DB2 监控,必须在连接或实例级别上进行设置.有一系列监视器开关来决定是否监控某种数据元素.还预留了一个内存堆,用于包含为监控而存储的信息.1:在instance级别上设 ...
- python编辑excel
转: http://www.cnblogs.com/lhj588/archive/2012/01/06/2314181.html
- 20172325 2017-2018-2 《Java程序设计》第六周学习总结
20172325 2017-2018-2 <Java程序设计>第六周学习总结 教材学习内容总结 1.利用[ ]建立一个数组,整列数据可以通过数组名引用,数组中的每个元素则可以通过其在数组中 ...