信息学奥赛一本通 1379:热浪(heatwv) | 洛谷 P1339 [USACO09OCT]Heat Wave G
【题目链接】
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相关推荐
- 反素数 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 ...
- 信息学奥赛一本通1379:热浪(heatwv) 图论dijkastra算法
1379:热浪(heatwv) [题目描述] 德克萨斯纯朴的民眾们这个夏天正在遭受巨大的热浪!!!他们的德克萨斯长角牛吃起来不错,可是他们并不是很擅长生產富含奶油的乳製品.Farmer John此时以 ...
- 信息学奥赛一本通(1086:角谷猜想)
1086:角谷猜想 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 46453 通过数: 27727 [题目描述] 谓角谷猜想,是指对于任意一个正整数,如果 ...
- 信息学奥赛一本通 1278:【例9.22】复制书稿(book) | 洛谷 P1281 书的复制
[题目链接] ybt 1278:[例9.22]复制书稿(book) 洛谷 P1281 书的复制 [题目考点] 1. 动态规划:线性动规 [解题思路] 该题可以抽象为:将由m个数字构成的序列分成k个子段 ...
- 信息学奥赛一本通 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 ...
- 信息学奥赛一本通(基础算法与数据结构-题解汇总目录)
信息学奥赛一本通(C++版)在线评测系统 基础(二)基础算法 更新中...... 第一章高精度计算 1307[例1.3]高精度乘法 1308[例1.5]高精除 1309[例1.6]回文数(Noip ...
- 《信息学奥赛一本通提高篇》第6章 组合数学
例1 计算系数(NOIP2011提高) 信息学奥赛一本通(C++版)在线评测系统 NOIP2011计算系数_nanhan27的博客-CSDN博客 「NOIP2011」 计算系数 - 组合数_TbYan ...
- 信息学奥赛一本通 提高篇 第六部分 数学基础 相关的真题
第1章 快速幂 1875:[13NOIP提高组]转圈游戏 信息学奥赛一本通(C++版)在线评测系统 第2 章 素数 第 3 章 约数 第 4 章 同余问题 第 5 章 矩阵乘法 第 6 章 ...
- 信息学奥赛一本通 提高篇 第六部分 数学基础 第1章 快速幂
信息学奥赛一本通 提高篇 第六部分 数学基础 第1章 快速幂 https://blog.csdn.net/mrcrack/article/details/82846727 快速幂取模算法如何实现? h ...
最新文章
- 力扣(LeetCode)刷题,简单题(第7期)
- 【VMCloud云平台】SCO(四)流程准备
- 课后作业:字符串加密
- boost::fusion::filter_view用法的测试程序
- 想要成为Java架构师不容放过的知识—Maven的版本发布
- java学习(68):局部内部类
- Leetcode--229. 求众数Ⅱ
- Docker 私有仓库搭建
- mysql5.7.10安装时密码_Windows10中MySQL5.7安装及修改root密码的详细方法
- Harmony OS — PageSlider滑动页面
- GEO基因芯片数据处理精华(一):GEOquery包
- 金山IPO造富效应:中国最贵程序员群生态
- android打印机驱动4521,三星打印机驱动官方下载
- 2021-05-14
- C++驱动海康威视摄像头
- python 更换windows壁纸(简单)
- 360奇舞团钟恒:选用Vue.js进行组件化开发,我们遇到了哪些坑?
- 如何快速学习flex
- 矩阵树定理--luoguP4208 [JSOI2008]最小生成树计数
- 机械手臂c语言如何编程,一种串联机械手臂的示教编程方法