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) 后缀数组概念...还算是简单的,过程 ...
随机推荐
- Spring+SpringMVC+MyBatis+easyUI整合进阶篇(十二)Spring集成Redis缓存
作者:13 GitHub:https://github.com/ZHENFENG13 版权声明:本文为原创文章,未经允许不得转载. 整合Redis 本来以为类似的Redis教程和整合代码应该会很多,因 ...
- Python_闭包_27
#闭包:嵌套函数,内部函数 并且必须调用外部函数的变量 def outer(): a = 1 def inner(): print(a) inner() print(inner.__closure__ ...
- 使用docker安装paddlepaddle 和 tensorflow
1.tensorflow安装 http://blog.csdn.net/freewebsys/article/details/70237003 (1)拉取镜像:docker pull tensorfl ...
- s标签s:if和s:set实现一个表格显示为多个表格
1.首先本来这个表格是这样的 2.这时候代码是这样的 <table cellpadding="4"> <tr> <th>指标点</th&g ...
- personal project
words count program 统计文本文件的字符数,单词数和行数. 实现一个统计程序,他能正确的统计程序文件中的字符数,单词数和行数. 源码链接 https://github.com/sup ...
- 第三个Sprint冲刺第5天
成员:罗凯旋.罗林杰.吴伟锋.黎文衷 各成员努力完成最后冲刺
- Running kubernetes on windows
docker-for-desktop minikube GKE cluster(?) docker-for-desktop https://docs.docker.com/docker-for-win ...
- Spring Cloud 路由网关服务端
修改application.properties配置文件:服务端口号.本机名称: 启动注册中心:java -jar uap-register-server-1.0.jar --spring.confi ...
- js排序方法
function swap(ary, x, y) { if (x === y) return let temp = ary[x] ary[x] = ary[y] ary[y] = temp } //生 ...
- [转帖]2016年时的新闻:ASP.NET Core 1.0、ASP.NET MVC Core 1.0和Entity Framework Core 1.0
ASP.NET Core 1.0.ASP.NET MVC Core 1.0和Entity Framework Core 1.0 http://www.cnblogs.com/webapi/p/5673 ...