这么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 热浪 最短路径模板题的更多相关文章

  1. HDU 2544 最短路(模板题)

    求1到N的最短路径,模板题,以1为源点,用dijkstra算法(可以用优先级队列优化) #include <iostream> #include <algorithm> #in ...

  2. HDU-1874 畅通工程续 (最短路径启蒙题)

    hdu 1874比较基础,拿来练各种刚学会的算法比较好,可以避免好多陷阱,典型的最短路模板题 畅通工程续 Time Limit: 3000/1000 MS (Java/Others)    Memor ...

  3. 动态树LCT(Link-cut-tree)总结+模板题+各种题目

    一.理解LCT的工作原理 先看一道例题: 让你维护一棵给定的树,需要支持下面两种操作: Change x val:  令x点的点权变为val Query x y:  计算x,y之间的唯一的最短路径的点 ...

  4. 洛谷P1339 热浪

    P1339 热浪 529通过 1.3K提交 题目提供者yeszy 标签图论福建省历届夏令营 难度普及+/提高 提交该题 讨论 题解 记录 最新讨论 求助...为什么是未知错误… 求修正,貌似死循环 第 ...

  5. [poj2449]Remmarguts' Date(K短路模板题,A*算法)

    解题关键:k短路模板题,A*算法解决. #include<cstdio> #include<cstring> #include<algorithm> #includ ...

  6. HDU-2544 最短路 Dijkstra模板题

    题目链接:https://vjudge.net/problem/HDU-2544 题意: 题目要求找到节点1到节点n之间的一条最短路 分析: Dijkstra模板题 单源最短路径,可以用dijkstr ...

  7. [AHOI 2009] 维护序列(线段树模板题)

    1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec  Memory Limit: 64 MB Description 老师交给小可可一个维护数列的任务,现在小 ...

  8. HDU 2222 AC自动机模板题

    题目: http://acm.hdu.edu.cn/showproblem.php?pid=2222 AC自动机模板题 我现在对AC自动机的理解还一般,就贴一下我参考学习的两篇博客的链接: http: ...

  9. POJ2774 & 后缀数组模板题

    题意: 求两个字符串的LCP SOL: 模板题.连一起搞一搞就好了...主要是记录一下做(sha)题(bi)过程心(cao)得(dan)体(xin)会(qing) 后缀数组概念...还算是简单的,过程 ...

随机推荐

  1. 大数据之Flume

    什么是Flume ApacheFlume是一个分布式的.可靠的.可用的系统,用于高效地收集.聚合和将大量来自不同来源的日志数据移动到一个集中的数据存储区. 系统要求 1. JDK 1.8 或以上版本 ...

  2. Mac下通过VMware Fusion安装centos虚拟机操作记录

    下面介绍下利用VMware Fusion工具在Mac上安装centos虚拟机的做法:1)下载VMware Fusion工具下载地址(包括注册码):http://www.macx.cn/thread-2 ...

  3. BAT大厂面试流程剖析

    在当今互联网中,虽然互联网行业从业者众多,不断崛起的互联网公司也会很多,但如BAT等大厂,仍然是很多同学想要进入的企业.那么本篇文章将会为大家很直白的讲解大厂的面试流程以及侧重点. 首先闲聊一下,为什 ...

  4. C. Meme Problem

    链接 [http://codeforces.com/contest/1076/problem/C] 题意 a+b=d and a⋅b=d. 计算出a和b 分析 ab=a(d-a)=d aa-ad+d= ...

  5. 实验--使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用(杨光)

    使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用 攥写人:杨光  学号:20135233 ( *原创作品转载请注明出处*) ( 学习课程:<Linux内核分析>MOOC课程 ...

  6. 20135316Linux内核学习笔记第六周

    20135316王剑桥<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC 1000029000 一.进程控制块PCB--task_ ...

  7. 使用代理创建连接池 proxyPool

    配置文件properties url=jdbc:mysql://127.0.0.1:3306/mine?characterEncoding=UTF-8 user=root password=1234 ...

  8. java感想

    Java学起来很有趣,通过学习Java可以提高自己的逻辑能力.在学习Java期间我们做了一些程序,我们班的同学也都积极准备,完成的还不错!在做程序时,我遇到了一些难题,有时也会出现错误,时间长了弄得我 ...

  9. @ModelAttribute注解(SpringMVC)

    在方法定义上使用 @ModelAttribute 注解:Spring MVC 在调用目标处理方法前,会先逐个调用在方法级上标注了 @ModelAttribute 的方法. 在方法的入参前使用 @Mod ...

  10. Xcode自动选择证书

    从xcode3时代习惯了手动选择证书,即 Provisioning Profile和 Code Signing Identify. 而随着团队扩大,应用量增多,需要管理的证书也越来越多,每次从长长的l ...