swustojRenting Boats(0574)

2024-03-02 11:08
文章标签 boats swustojrenting 0574

本文主要是介绍swustojRenting Boats(0574),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

长江游艇俱乐部在长江上设置了n 个游艇出租站1,2,…,n。游客可在这些游艇出租站租用游艇,并在下游的任何一个游艇出租站归还游艇。游艇出租站i 到游艇出租站j 之间的租金为r(i,j),1< =i< j < =n。试设计一个算法,计算出从游艇出租站1 到游艇出租站n 所需的最少租金。

Description

第1 行中有1 个正整数n(n<=200),表示有n个游艇出租站。接下来的n-1 行是r(i,j),1< =i< j < =n。

Input

从游艇出租站1 到游艇出租站n所需的最少租金

Output
1
2
3
3
5 15
7
Sample Input
1
12
/*就是最短路,没什么其他的,
用dijkstra算法解决*/#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include<stack>
#include<iostream>
#include<string.h>
#include<math.h>
using namespace std;
#define INF 9999999
int mp[205][205];
int vis[205];
int dis[205];
int n;void init()
{for (int i = 0; i <= n; i++){for (int j = 0; j <= n; j++){mp[i][j] = INF;}}memset(vis, 0, sizeof(vis));
}void dj(int ss)
{for (int i = 1; i <= n; i++){dis[i] = mp[ss][i];}vis[ss] = 1;for (int i = 2; i <= n; i++){int _max = INF;int _maxid = -1;for (int j = 1; j <= n; j++)//找出最小的点{if (_max > dis[j] && !vis[j]){_max = dis[_maxid=j];}}vis[_maxid] = 1;for (int j = 1; j <= n; j++)//通过这个点缩短其他点的距离{if (!vis[j] && dis[j] > dis[_maxid] + mp[_maxid][j]){dis[j] = dis[_maxid] + mp[_maxid][j];}}}
}int main()
{while (cin >> n){init();for (int i = 1; i <= n - 1; i++)//转化为图再计算{for (int j = i + 1; j <= n; j++){scanf("%d", &mp[i][j]);}}dj(1);cout << dis[n] << endl;}return 0;
}


这篇关于swustojRenting Boats(0574)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/765913

相关文章

【LeetCode双指针】881 救生艇 Boats to Save People(java实现)

文章目录 题目描述一、解题思路二、代码1.救生艇2.执行时间 总结 题目描述 给定数组 people 。people[i]表示第 i 个人的体重 ,船的数量不限,每艘船可以承载的最大重量为 limit。每艘船最多可同时载两人,但条件是这些人的重量之和最多为 limit。返回承载所有人所需的最小船数 。 示例 1: 输入:people = [1,2], limit =