本文主要是介绍swustojRenting Boats(0574),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
长江游艇俱乐部在长江上设置了n 个游艇出租站1,2,…,n。游客可在这些游艇出租站租用游艇,并在下游的任何一个游艇出租站归还游艇。游艇出租站i 到游艇出租站j 之间的租金为r(i,j),1< =i< j < =n。试设计一个算法,计算出从游艇出租站1 到游艇出租站n 所需的最少租金。
第1 行中有1 个正整数n(n<=200),表示有n个游艇出租站。接下来的n-1 行是r(i,j),1< =i< j < =n。
从游艇出租站1 到游艇出租站n所需的最少租金
1 2 3 | 3 5 15 7 |
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)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!