問題の説明
問題の説明
昔、T王国は前例のない繁栄を遂げました。国をよりよく管理するために、王国は首都と王国の主要都市を結ぶために多数の高速道路を建設しました。お金を節約するために、T国の大臣は、首都から直接、または他の大都市を経由して間接的にどの大都市にも到達できるように、考えた上で優れた建設計画を策定しました。同時に、大都市を繰り返し通過しない場合、首都から各大都市に到達する計画は独特です。
JはT国の重要な大臣です。彼は人々の感情を評価するために主要都市間をパトロールします。したがって、ある都市から別の都市へのノンストップは、Jが行う最も一般的なこととなっています。彼は都市間の旅費を保管するための財布を持っています。
賢いJは、特定の都市で修理をやめない場合、継続的な旅行の過程で、彼が費やす旅費は彼が移動した距離に関連し、x番目のキロメートルからx + 1キロメートル中(xは整数)、彼の旅費はx +10です。つまり、1キロ歩くのに11、2キロ歩くのに23かかります。
J大臣が知りたいのは、ある都市から出発して休憩せずに別の都市に到着するときに費やす可能性のある旅費の最大額はいくらですか。
入力形式入力
の最初の行には整数nが含まれています。これは、首都を含むT王国の都市の数を表します。都市には1から順に番号が付けられ、都市1が首都です。
次の行n-1は、T国の高速道路を示しています(T国の高速道路はn-1でなければなりません)
各線には3つの整数Pi、Qi、Diがあり、都市Piと都市Qiの間に高速道路があり、長さがDiキロメートルであることを示しています。
出力形式
整数を出力します。これは、大臣Jが道路で最も多く費やした金額を示します。サンプル入力1
5
1 2 2
1 3 1
2 4 5
2 5 4
サンプル出力1
135
出力フォーマット
都市5都市4から大臣J 135通行料の費用がかかります。
問題分析
暴力的な再帰25ポイント
#include <iostream>
#include <algorithm>
using namespace std;
/*
样例输入1
5
1 2 2
1 3 1
2 4 5
2 5 4
样例输出1
135
*/
int n;
int res;
class Point{
public:
int num;//点的编号
int cost;//到该点距离
};
void dfs(vector<Point> m[], int vis[], int i, int j, int dis){
//是否有直接邻居
for(int k = 0 ; k < m[i].size(); k++){
if(m[i][k].num == j){ //m[i]的直接邻居有j
res = max(res, dis+m[i][k].cost);
return;
}
}
vis[i] = 0;
//递归,不是直接邻居,
for(int k = 0; k < m[i].size(); k++){
if(vis[m[i][k].num] == -1){
dfs(m, vis, m[i][k].num, j, dis+m[i][k].cost);
}
}
vis[i] = -1;
}
int dis2money(int dis){
return (11 + 10 + dis)*dis/2;
}
int main(int argc, char** argv) {
cin >> n;
vector<Point> m[n+1]; //m[i]表示i点的邻居集合
int vis[n+1] = {-1};
for(int i = 1; i < n; i++){
int a, b, c;
cin >> a >> b >>c;
Point p1 = {b, c};
Point p2 = {a, c};
m[a].push_back(p1);
m[b].push_back(p2);
}
for(int i = 1; i <= n-1; i++){
for(int j = i+1; j <= n; j++){
dfs(m, vis, i, j, 0);
}
}
// cout << res << endl;
cout << dis2money(res) << endl;
return 0;
}
方法22回dfs
#include <iostream>
#include <algorithm>
using namespace std;
/*
样例输入1
5
1 2 2
1 3 1
2 4 5
2 5 4
样例输出1
135
*/
int n;
int res;
int pnt = -1;
class Point{
public:
int num;//点的编号
int cost;//到该点距离
};
void dfs(vector<Point> m[], int vis[], int start, int dis){
vector<Point> nei_i = m[start];
vis[start] = 0;
bool isLeaf = true;
for(int k = 0; k < nei_i.size(); k++){
int num = nei_i[k].num;
if(vis[num] == -1){
isLeaf = false;
dfs(m, vis, num, dis + nei_i[k].cost);
}
}
vis[start] = -1;
if(isLeaf){
if(dis > res){
res = dis;
pnt = start;
}
}
}
int dis2money(int dis){
return (11 + 10 + dis)*dis/2;
}
int main(int argc, char** argv) {
cin >> n;
vector<Point> m[n+1]; //m[i]表示i点的邻居集合
int vis[n+1] = {-1};
for(int i = 0; i < n-1; i++){
int a, b, c;
cin >> a >> b >>c;
Point p1 = {b, c};
Point p2 = {a, c};
m[a].push_back(p1);
m[b].push_back(p2);
}
dfs(m , vis, 1, 0);
res = 0;
dfs(m, vis, pnt, 0);
cout << pnt;
// cout << dis2money(res) << endl;
return 0;
}