【题目链接】

ybt 1379:热浪(heatwv)
洛谷 P1339 [USACO09OCT]Heat Wave G

【题目考点】

1. 图论:最短路径

【解题思路】

首先抽象建模。城镇为顶点,道路为边,道路的通过费用为边的权值。道路是双向的,所以是无向图。该问题求从起始城镇到终点城镇的最小费用,实际就是求从起始顶点到终点顶点的最短路径的权值。
该题中城镇数(顶点数)最大为2500,可以使用Dijkstra算法,Dijkstra算法堆优化,及SPFA算法。

【题解代码】

解法1:Dijkstra算法

#include<bits/stdc++.h>
using namespace std;
#define N 2505
struct Edge
{int v, w;Edge(){}Edge(int a, int b):v(a), w(b){}
};
vector<Edge> edge[N];//邻接表
bool vis[N];//vis[i]:顶点i是否访问过
int n, m, s, t, dis[N];//dis[i]:起点到i的最短路径距离
void dijkstra(int sv)//sv:起点
{memset(dis, 0x3f, sizeof(dis));dis[sv] = 0;for(int k = 1; k <= n; ++k){int u = 0;for(int i = 1; i <= n; ++i)if(vis[i] == false && (u == 0 || dis[i] < dis[u]))u = i;vis[u] = true;for(Edge e : edge[u]){int v = e.v, w = e.w;if(vis[v] == false && dis[v] > dis[u]+w)dis[v] = dis[u]+w; }}
}
int main()
{int u, v, w;cin >> n >> m >> s >> t;//n:顶点数 m:边数 s:起点 t:终点 for(int i = 1; i <= m; ++i){cin >> u >> v >> w;edge[u].push_back(Edge(v, w));edge[v].push_back(Edge(u, w));}dijkstra(s);cout << dis[t];return 0;
}

解法2:Dijkstra堆优化算法

#include<bits/stdc++.h>
using namespace std;
#define N 2505
struct Pair
{int u, d;//u:顶点 d:距离 Pair(){}Pair(int a, int b):u(a),d(b){}bool operator < (const Pair &b) const//优先队列中 d更小的更优先 {return b.d < d;}
};
struct Edge
{int v, w;Edge(){}Edge(int a, int b):v(a), w(b){}
};
vector<Edge> edge[N];//邻接表
bool vis[N];//vis[i]:顶点i是否访问过
int n, m, s, t, dis[N];//dis[i]:起点到i的最短路径距离
void dijkstra(int sv)//sv起始点
{priority_queue<Pair> pq;//优先队列中 d更小的更优先 memset(dis, 0x3f, sizeof(dis));//dis初始值为INFdis[sv] = 0;pq.push(Pair(sv, 0));while(pq.empty() == false){int u = pq.top().u;pq.pop();if(vis[u])//如果顶点u已经访问过,则跳过 continue;vis[u] = true;for(Edge e : edge[u]){int v = e.v, w = e.w;if(vis[v] == false && dis[v] > dis[u]+w)dis[v] = dis[u]+w; }}
}
int main()
{int u, v, w;cin >> n >> m >> s >> t;//n:顶点数 m:边数 s:起点 t:终点 for(int i = 1; i <= m; ++i){cin >> u >> v >> w;edge[u].push_back(Edge(v, w));edge[v].push_back(Edge(u, w));}dijkstra(s);cout << dis[t];return 0;
}

解法3:SPFA算法

#include<bits/stdc++.h>
using namespace std;
#define N 2505
struct Edge
{int v, w;Edge(){}Edge(int a, int b):v(a), w(b){}
};
vector<Edge> edge[N];//邻接表
bool vis[N];//vis[i]:顶点i是否在队列中
int n, m, s, t, dis[N];//dis[i]:起点到i的最短路径距离
void spfa(int sv)
{memset(dis, 0x3f, sizeof(dis));queue<int> que;dis[sv] = 0;que.push(sv);vis[sv] = true;while(que.empty() == false){int u = que.front();que.pop();vis[u] = false;for(Edge e : edge[u]){int v = e.v, w = e.w;if(dis[v] > dis[u]+w){dis[v] = dis[u]+w;if(vis[v] == false){que.push(v);vis[v] = true;}}}}
}
int main()
{int u, v, w;cin >> n >> m >> s >> t;//n:顶点数 m:边数 s:起点 t:终点 for(int i = 1; i <= m; ++i){cin >> u >> v >> w;edge[u].push_back(Edge(v, w));edge[v].push_back(Edge(u, w));}spfa(s);cout << dis[t];return 0;
}

信息学奥赛一本通 1379:热浪(heatwv) | 洛谷 P1339 [USACO09OCT]Heat Wave G相关推荐

  1. 反素数 Antiprime(信息学奥赛一本通 1625)(洛谷 1463)

    题目描述 对于任何正整数x,其约数的个数记作g(x).例如g(1)=1.g(6)=4. 如果某个正整数x满足:g(x)>g(i) 0<i<x,则称x为反质数.例如,整数1,2,4,6 ...

  2. 信息学奥赛一本通1379:热浪(heatwv) 图论dijkastra算法

    1379:热浪(heatwv) [题目描述] 德克萨斯纯朴的民眾们这个夏天正在遭受巨大的热浪!!!他们的德克萨斯长角牛吃起来不错,可是他们并不是很擅长生產富含奶油的乳製品.Farmer John此时以 ...

  3. 信息学奥赛一本通(1086:角谷猜想)

    1086:角谷猜想 时间限制: 1000 ms         内存限制: 65536 KB 提交数: 46453     通过数: 27727 [题目描述] 谓角谷猜想,是指对于任意一个正整数,如果 ...

  4. 信息学奥赛一本通 1278:【例9.22】复制书稿(book) | 洛谷 P1281 书的复制

    [题目链接] ybt 1278:[例9.22]复制书稿(book) 洛谷 P1281 书的复制 [题目考点] 1. 动态规划:线性动规 [解题思路] 该题可以抽象为:将由m个数字构成的序列分成k个子段 ...

  5. 信息学奥赛一本通 1294:Charm Bracelet | OpenJudge NOI 2.6 7113:Charm Bracelet | 洛谷 P2871

    [题目链接] ybt 1294:Charm Bracelet OpenJudge NOI 2.6 7113:Charm Bracelet 洛谷 P2871 [USACO07DEC]Charm Brac ...

  6. 信息学奥赛一本通(基础算法与数据结构-题解汇总目录)

    信息学奥赛一本通(C++版)在线评测系统 基础(二)基础算法   更新中...... 第一章高精度计算 1307[例1.3]高精度乘法 1308[例1.5]高精除 1309[例1.6]回文数(Noip ...

  7. 《信息学奥赛一本通提高篇》第6章 组合数学

    例1 计算系数(NOIP2011提高) 信息学奥赛一本通(C++版)在线评测系统 NOIP2011计算系数_nanhan27的博客-CSDN博客 「NOIP2011」 计算系数 - 组合数_TbYan ...

  8. 信息学奥赛一本通 提高篇 第六部分 数学基础 相关的真题

    第1章   快速幂 1875:[13NOIP提高组]转圈游戏 信息学奥赛一本通(C++版)在线评测系统 第2 章  素数 第 3 章  约数 第 4 章  同余问题 第 5 章  矩阵乘法 第 6 章 ...

  9. 信息学奥赛一本通 提高篇 第六部分 数学基础 第1章 快速幂

    信息学奥赛一本通 提高篇 第六部分 数学基础 第1章 快速幂 https://blog.csdn.net/mrcrack/article/details/82846727 快速幂取模算法如何实现? h ...

最新文章

  1. 力扣(LeetCode)刷题,简单题(第7期)
  2. 【VMCloud云平台】SCO(四)流程准备
  3. 课后作业:字符串加密
  4. boost::fusion::filter_view用法的测试程序
  5. 想要成为Java架构师不容放过的知识—Maven的版本发布
  6. java学习(68):局部内部类
  7. Leetcode--229. 求众数Ⅱ
  8. Docker 私有仓库搭建
  9. mysql5.7.10安装时密码_Windows10中MySQL5.7安装及修改root密码的详细方法
  10. Harmony OS — PageSlider滑动页面
  11. GEO基因芯片数据处理精华(一):GEOquery包
  12. 金山IPO造富效应:中国最贵程序员群生态
  13. android打印机驱动4521,三星打印机驱动官方下载
  14. 2021-05-14
  15. C++驱动海康威视摄像头
  16. python 更换windows壁纸(简单)
  17. 360奇舞团钟恒:选用Vue.js进行组件化开发,我们遇到了哪些坑?
  18. 如何快速学习flex
  19. 矩阵树定理--luoguP4208 [JSOI2008]最小生成树计数
  20. 机械手臂c语言如何编程,一种串联机械手臂的示教编程方法

热门文章

  1. JVM虚拟机的运行机制和原理
  2. css如何让页面填满剩余高度与宽度
  3. 使用python的trapz做采样数值计算得出积分结果
  4. JS获取父节点、子节点、兄弟节点
  5. JavaScript之解构赋值
  6. IT人如何突破技术瓶颈
  7. python做线性回归_利用 python 进行线性回归
  8. 在 Linux 终端中实现回收站功能
  9. MySQL 最左原则的理解
  10. python tkinter 各控件属性 全