P1339 热浪 最短路径模板题
这么naive的题面一看就是最短路模板题~~~
ok。首先是floyd算法,tts,记得把k放在最外面就行了。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int a[][];
int main()
{
int m,n,c,b;
memset(a,0x3f,sizeof(a));
scanf ("%d%d%d%d",&n,&m,&c,&b);
int x,y,z;
while(m--)
{
scanf ("%d%d%d",&x,&y,&z);
a[x][y]=z;
a[y][x]=z;
}
for(int k=;k<=n;k++)
{
for(int i=;i<=n;i++)
{
for(int j=;j<=n;j++)
{
a[i][j]=min(a[i][j],a[i][k]+a[k][j]);
}
}
}
printf("%d",a[c][b]);
return ;
}
Floyd
没有任何的参考价值,除非你要做多源最短路径(☺)
next,SPFA算法,最短路径更快算法(☺),shortest path faster algorithm
思想是这样的:从起点开始入队,然后每次取出一个点,消除标记,轮边松弛。
对于松弛了的边,如果在队中就不用管。否则入队+标记。
然后就能很naive的输出答案了!
注意:当一个点进队超过n次就有负环。
十分规范的模板。
#include <cstdio>
#include <queue>
using namespace std;
const int N = ;
int n,top;
struct Edge
{
int u,v,len,next,num;
}edge[N];
struct Point
{
int dis=0x3f3f3f3f,e,c,num;
bool vis;
}point[N]; bool spfa(int k)
{
queue<int>p;
point[k].vis=;
point[k].c++;
point[k].dis=;
p.push(k);
int op,ed,i;
while(!p.empty())
{
op=p.front();
p.pop();
point[op].vis=;
i=point[op].e;
while(i)
{
ed=edge[i].v;
if(point[ed].dis>point[op].dis+edge[i].len)
{
point[ed].dis=point[op].dis+edge[i].len;
if(point[ed].vis) continue;
point[ed].vis=;
p.push(ed);
point[ed].c++;
if(point[ed].c>n) return ;
}
i=edge[i].next;
}
}
return true;
}
void add(int x,int y,int z)
{
top++;
edge[top].u=x;
edge[top].v=y;
edge[top].len=z;
edge[top].num=top;
edge[top].next=point[x].e;
point[x].e=top;
return;
}
int main()
{
int m,a,b;
scanf ("%d%d%d%d",&n,&m,&a,&b);
for(int i=;i<=n;i++) point[i].num=i;
int x,y,z;
for(int i=;i<=m;i++)
{
scanf ("%d%d%d",&x,&y,&z);
add(x,y,z);
add(y,x,z);
}
if(!spfa(a)) printf("-1");
else printf("%d",point[b].dis);
return ;
}
SPFA spfa
接下来是稠密图上的dijkstra算法,di jk s tra(☺)
思想:来个优先队列,dis小的点先出。
起点入队,然后每次取出一个未标记的点标记已读,然后轮边。
如果终点被标记就continue,记得更新i。否则松弛一下,不管有没有成功都入队。
今天刚打的代码,也很规范。
(缺点:边权不能为负)
#include <cstdio>
#include <queue>
using namespace std;
const int N = ;
int top;
struct Edge
{
int u,v,len,next,num;
}edge[N];
struct Point
{
int e,dis=0x3f3f3f3f,c,num;
bool vis;
bool operator < (const Point &a) const
{
return this->dis > a.dis;
}
}point[N]; void dijkstra(int k)
{
priority_queue<Point>p;
p.push(point[k]);
point[k].vis=;
point[k].dis=;
int op,ed,i;
while(!p.empty())
{
while((!p.empty())&&(p.top().vis)) p.pop();
if(p.empty()) break;
op=p.top().num;
p.pop();
point[op].vis=;
i=point[op].e;
while(i)
{
ed=edge[i].v;
if(point[ed].vis) {i=edge[i].next;continue;}
if(point[ed].dis>point[op].dis+edge[i].len) point[ed].dis=point[op].dis+edge[i].len;
p.push(point[ed]);
i=edge[i].next;
}
}
return;
} void add(int x,int y,int z)
{
top++;
edge[top].u=x;
edge[top].v=y;
edge[top].len=z;
edge[top].num=top;
edge[top].next=point[x].e;
point[x].e=top;
return;
}
int main()
{
int m,n,a,b;
scanf ("%d%d%d%d",&n,&m,&a,&b);
int x,y,z;
for(int i=;i<=n;i++) point[i].num=i;
while(m--)
{
scanf ("%d%d%d",&x,&y,&z);
add(x,y,z);
add(y,x,z);
}
dijkstra(a);
printf("%d",point[b].dis);
return ;
}
Dijkstra
That's all,thanks for watching.
P1339 热浪 最短路径模板题的更多相关文章
- HDU 2544 最短路(模板题)
求1到N的最短路径,模板题,以1为源点,用dijkstra算法(可以用优先级队列优化) #include <iostream> #include <algorithm> #in ...
- HDU-1874 畅通工程续 (最短路径启蒙题)
hdu 1874比较基础,拿来练各种刚学会的算法比较好,可以避免好多陷阱,典型的最短路模板题 畅通工程续 Time Limit: 3000/1000 MS (Java/Others) Memor ...
- 动态树LCT(Link-cut-tree)总结+模板题+各种题目
一.理解LCT的工作原理 先看一道例题: 让你维护一棵给定的树,需要支持下面两种操作: Change x val: 令x点的点权变为val Query x y: 计算x,y之间的唯一的最短路径的点 ...
- 洛谷P1339 热浪
P1339 热浪 529通过 1.3K提交 题目提供者yeszy 标签图论福建省历届夏令营 难度普及+/提高 提交该题 讨论 题解 记录 最新讨论 求助...为什么是未知错误… 求修正,貌似死循环 第 ...
- [poj2449]Remmarguts' Date(K短路模板题,A*算法)
解题关键:k短路模板题,A*算法解决. #include<cstdio> #include<cstring> #include<algorithm> #includ ...
- HDU-2544 最短路 Dijkstra模板题
题目链接:https://vjudge.net/problem/HDU-2544 题意: 题目要求找到节点1到节点n之间的一条最短路 分析: Dijkstra模板题 单源最短路径,可以用dijkstr ...
- [AHOI 2009] 维护序列(线段树模板题)
1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec Memory Limit: 64 MB Description 老师交给小可可一个维护数列的任务,现在小 ...
- HDU 2222 AC自动机模板题
题目: http://acm.hdu.edu.cn/showproblem.php?pid=2222 AC自动机模板题 我现在对AC自动机的理解还一般,就贴一下我参考学习的两篇博客的链接: http: ...
- POJ2774 & 后缀数组模板题
题意: 求两个字符串的LCP SOL: 模板题.连一起搞一搞就好了...主要是记录一下做(sha)题(bi)过程心(cao)得(dan)体(xin)会(qing) 后缀数组概念...还算是简单的,过程 ...
随机推荐
- Centos下MooseFS(MFS)分布式存储共享环境部署记录
分布式文件系统(Distributed File System)是指文件系统管理的物理存储资源不一定直接连接在本地节点上,而是通过计算机网络与节点相连,分布式文件系统的实际基于客户机/服务器模式.目前 ...
- 熟记这些git命令,你就是大神
1.git log 查看 提交历史 默认不用任何参数的话,git log 会按提交时间列出所有的更新,最近的更新排在最上面 2.git log -p -2 常用 -p 选项展开显示每次提交的内容差异 ...
- 个人博客作业Week2(9月30日)
一.是否需要有代码规范 1.这些规范都是官僚制度下产生的浪费大家的编程时间.影响人们开发效率, 浪费时间的东西. 这些规范并不是一开始就有的,也不是由某个人规定的,代码规范是程序员们在不断地编程实践过 ...
- 2-Twenty First Scrum Meeting-20151221
任务安排 成员 今日完成 明日任务 闫昊 请假(数据库) 唐彬 请假(数据库) 史烨轩 尝试使用downloadmanager对notification进行更新 尝试使用downloadm ...
- 《Linux内核分析》第七周笔记 可执行程序的装载
20135132陈雨鑫 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 ...
- linux内核分析程序破解实践报告
- “数学口袋精灵”App的第三个Sprint计划----开发日记(第十一天12.17)
项目进度: 基本完成一个小游戏,游戏具有:随机产生算式,判断对错功能.通过轻快的背景音乐,音效,给玩家提供一个良好的氛围. 任务分配: 冯美欣:设计"数学口袋精灵"App图标.整 ...
- 总结 推广app
扫一扫二维码即可安装使用我们的app,方便快捷. 电脑端下载地址:http://pan.baidu.com/s/1bocWPPX http://a.app.qq.com/o/simple.jsp?pk ...
- docker+redis 持久化配置(AOF)
RDB持久化与AOF持久化简单描述 RDB:RDB使用快照的方式存储数据库中的内容,直接将所有键值对数据全部存入二进制文件.建议使用BGSAVE来进行备份,整个过程会新fork一个子进程来执行,不影响 ...
- how-is-docker-different-from-a-normal-virtual-machine[Docker与VirtualMachine的区别]
https://stackoverflow.com/questions/16047306/how-is-docker-different-from-a-normal-virtual-machine 被 ...