pta 编程题20 旅游规划
其它pta数据结构编程题请参见:pta
这个最短路径问题只需要求两点之间的最短路径,因而在Dijikstra算法中当求出目标点的最短路径之后跳出循环即可。
#include <iostream>
using namespace std; struct Node
{
int length;
int price;
}; int V, E;
Node **G; void buildGraph();
void deleteGraph();
void dijkstra(int s, int d);
int findMinDist(Node* dist, bool* collected);
bool cmp(Node a, Node b); int main()
{
int S, D;
cin >> V >> E >> S >> D;
buildGraph();
dijkstra(S, D);
deleteGraph();
return ;
} void buildGraph()
{
int a, b, l, p, i;
G = new Node*[V];
for (a = ; a < V; a++)
{
G[a] = new Node[V];
for (b = ; b < V; b++)
{
G[a][b].length = INT_MAX;
G[a][b].price = INT_MAX;
}
} for (i = ; i < E; i++)
{
cin >> a >> b >> l >> p;
G[a][b].length = l;
G[a][b].price = p;
G[b][a].length = l;
G[b][a].price = p;
}
} void deleteGraph()
{
for (int i = ; i < V; i++)
delete[] G[i];
delete[] G;
} bool cmp(Node a, Node b)
{
if (a.length != b.length)
return a.length < b.length;
else
return a.price < b.price;
} int findMinDist(Node* dist, bool* collected)
{
int minV;
Node minDist;
minDist.length = INT_MAX;
minDist.price = INT_MAX; for (int i = ; i < V; i++)
{
if (!collected[i] && cmp(dist[i], minDist))
{
minDist = dist[i];
minV = i;
}
} if (minDist.length == INT_MAX)
return -;
else
return minV;
} void dijkstra(int s, int d)
{
int v, w;
Node *dist, temp;
bool *collected;
dist = new Node[V];
collected = new bool[V];
for (v = ; v < V; v++)
{
dist[v] = G[s][v];
collected[v] = false;
} dist[s].length = ;
dist[s].price = ;
collected[s] = true; while (true)
{
v = findMinDist(dist, collected);
if (v == d) break;
collected[v] = true; for (w = ; w < V; w++)
{
if (!collected[w] && G[v][w].length < INT_MAX)
{
temp.length = dist[v].length + G[v][w].length;
temp.price = dist[v].price + G[v][w].price;
if (cmp(temp, dist[w]))
dist[w] = temp;
}
}
} cout << dist[d].length << " " << dist[d].price;
delete dist;
delete collected;
}
pta 编程题20 旅游规划的更多相关文章
- pta 编程题21 公路村村通
其它pta数据结构编程题请参见:pta 题目 这道题考察最小生成树问题,用的是Prim算法. 和Dijkstra算法相比,没有了collect数组,因为dist[v] == 0就代表v被已收录. #i ...
- pta编程题19 Saving James Bond 2
其它pta数据结构编程题请参见:pta 题目 和简单版本不同的是,简单版本只需判断能否到达岸边,而这个版本要求求出最少跳数的路径. 简单版本用dfs实现,而这道题用BFS实现. 注意: 岛半径为7.5 ...
- pta 编程题16 Saving James Bond - Easy Version
其它pta数据结构编程题请参见:pta 题目 主要用到了深度优先搜索. #include <iostream> using namespace std; struct Vertex { i ...
- pta 编程题15 列出连通集
其它pta数据结构编程题请参见:pta 题目 题目要求分别以深度优先搜索和广度优先搜索输出图的连通集. 广度优先搜索要用到队列,先回顾一下循环队列: struct QNode { int* Data; ...
- pta 编程题14 Huffman Codes
其它pta数据结构编程题请参见:pta 题目 题目给出一组字母和每个字母的频数,因为哈夫曼编码不唯一,然后给出几组编码,因为哈夫曼编码不唯一,所以让你判断这些编码是否符合是哈夫曼编码的一种. 解题思路 ...
- pta 编程题13 File Transfer
其它pta数据结构编程题请参见:pta 这道题考察的是union-find并查集. 开始把数组中每个元素初始化为-1,代表没有父节点.为了使树更加平衡,可以让每一个连通分量的树根的负值代表这个连通分量 ...
- pta 编程题12 堆中的路径
其它pta数据结构编程题请参见:pta 这道题考察的是最小堆. 堆是一个完全二叉树,因此可用数组表示,一个下标为 i 的结点的父节点下标为 i / 2,子结点下标为 2i 和 2i + 1. 插入元素 ...
- pta 编程题10 Root of AVL Tree
其它pta数据结构编程题请参见:pta 这道题考察平衡二叉查找树的插入. 为了保证二叉查找树的平衡,当一个结点的左右子树的高度差大于1时就要进行调整. 分为以下四种情况: 插入新节点后,以及旋转之后, ...
- pta 编程题8 Tree Traversals Again
其它pta数据结构编程题请参见:pta 这次的作业考察的是树的遍历. 题目的输入通过栈的pop给出了树的中序遍历的顺序.根据push和pop的顺序构造树的方法为:定义一个变量father来确定父节点, ...
随机推荐
- P2939 [USACO09FEB]改造路Revamping Trails(分层图最短路)
传送门 完了我好像连分层图最短路都不会了……果然还是太菜了…… 具体来说就是记录一个步数表示免费了几条边,在dijkstra的时候以步数为第一关键字,距离为第二关键字.枚举边的时候分别枚举免不免费下一 ...
- dblink 简单使用
create extension dblink查看连接:select dblink_get_connections()断开所有连接:select dblink_disconnect()断开指定名称的连 ...
- 使用pods添加第三方的时候,出现ld: library not found for -lpop
ld: library not found for -lpop 错误,是在使用pods添加第三方的时候,出现的编译错误,同时伴随着的是error: linker command failed with ...
- 表单和css
表单和CSS 一.==表单== 1. form表单本身 <form name="myform" action="#" method="get&q ...
- MySQL的复制:MySQL系列之十三
一.MySQL复制相关概念 主从复制:主节点将数据同步到多个从节点 级联复制:主节点将数据同步到一个从节点,其他的从节点在向从节点复制数据 同步复制:将数据从主节点全部同步到从节点时才返回给用户的复制 ...
- [USACO1.4]等差数列 Arithmetic Progressions
题目描述 一个等差数列是一个能表示成a, a+b, a+2b,..., a+nb (n=0,1,2,3,...)的数列. 在这个问题中a是一个非负的整数,b是正整数.写一个程序来找出在双平方数集合(双 ...
- 低价购买 dp
题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它 ...
- 微信授权登录(OAuth2.0)-- 随记
1.OAuth2.0简介 OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用. 允许用户 ...
- 约瑟夫问题(vector的使用)
题目大意:有n个人围坐在圆桌周围,每个人都有一个固定的编号. 从第s(<=n)个人开始报数(按照顺时针方向,从1开始),报到m的人出列,接着再从出列着的 下一个人开始报数(依然从1开始),报到m ...
- (转)Linux 文件和目录的属性
linux 文件属性与权限 原文:https://www.cnblogs.com/kzloser/articles/2673790.html https://www.cnblogs.com/danh/ ...