这么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. bootstrapTable使用场景及方式

    场景一:混合开发,适用jsp.php前端不足  纯html结构 <div> <table id="table" data-toggle="table&q ...

  2. 使用IdentityServer4实现一个简单的Oauth2客户端模式授权

    1.首先新建一个webAPI项目做为IdentityServer的服务端,提供生成Token的服务,首先修改Startup.cs文件,如下图: 2.增加一个Config.cs文件,以便于提供资源和认证 ...

  3. 测试网站页面网速的一个简单Python脚本

    无聊之余,下面分享一个Python小脚本:测试网站页面访问速度 [root@huanqiu ~]# vim pywww.py #!/usr/bin/python # coding: UTF-8 imp ...

  4. git学习心得

    https://github.com/zhangxinn/test/tree/master 自己虽然在课堂上有认真的听老师讲解如何使用github,包括怎样在线学习,怎样在github上建立自己的仓库 ...

  5. 可移动的 HelloWorld

    package com.home.test; import java.awt.Color;import java.awt.Cursor;import java.awt.Font;import java ...

  6. JavaScript的类、对象、原型、继承、引用

    以CSS为例,有一种为所有class为"xxxx"的元素添加样式(外联样式),那么所有class为xxx的元素样式就会改变,在css中像下面这么写: <html> &l ...

  7. 梯度、散度、旋度、Jacobian、Hessian、Laplacian 的关系图

    转自松鼠的窝 一.入门

  8. Jquery 组 标签页

    <!DOCTYPE html><html lang="zh-cn"><head> <meta charset="utf-8&qu ...

  9. ACM数论之旅12---康托展开((*゚▽゚*)装甲展开,主推进器启动,倒计时3,2,1......)

    在我们做题中,搜索也好,动态规划也好,我们往往有时候需要用一个数字表示一种状态 比如有8个灯泡排成一排,如果你用0和1表示灯泡的发光情况 那么一排灯泡就可以转换为一个二进制数字了 比如 0110011 ...

  10. Java之静态代码块

    有一些情况下,有些代码需要在项目启动的时候就执行,则需要使用静态代码块,这种代码是主动执行的.Java中的静态代码块是在虚拟机加载类的时候,就执行的,而且只执行一次.如果static代码块有多个,JV ...