[Coupe Blue Bridge] Formation aux examens réels 2013 C ++ A Groupe Question 10 Frais de voyage du ministre

Description du problème

Description du problème Il y a
longtemps, Kingdom T avait une prospérité sans précédent. Afin de mieux gérer le pays, le royaume a construit un grand nombre d'autoroutes pour relier la capitale et les grandes villes du royaume.

Afin d'économiser de l'argent, les ministres du pays T ont formulé un excellent plan de construction après réflexion, afin que toute grande ville puisse être atteinte directement depuis la capitale ou indirectement via d'autres grandes villes. En même temps, si vous ne traversez pas à plusieurs reprises les grandes villes, le plan pour atteindre chaque grande ville depuis la capitale est unique.

J est un ministre important du pays T. Il patrouille entre les grandes villes pour apprécier les sentiments de la population. Par conséquent, le non-stop d'une ville à une autre est devenu la chose la plus courante de J. Il a un sac à main pour stocker les frais de déplacement entre les villes.

L'intelligent J a constaté que s'il ne s'arrête pas pour réparer dans une certaine ville, en train de voyager continuellement, les frais de déplacement qu'il dépense sont liés à la distance qu'il a parcourue, et il parcourt le kilomètre du xième kilomètre au x + 1ème kilomètre. Moyenne (x est un entier), ses frais de déplacement sont x + 10 tellement. En d'autres termes, il en coûte 11 pour marcher 1 kilomètre et 23 pour marcher 2 kilomètres.

Le ministre J veut savoir: quel est le montant maximal des frais de déplacement qu'il pourrait dépenser en partant d'une certaine ville sans faire de pause et en arrivant dans une autre ville?

Format d'entrée
La première ligne d'entrée contient un entier n, qui représente le nombre de villes du Royaume T, capitale comprise

Les villes sont numérotées séquentiellement à partir de 1 et la ville 1 est la capitale.

Ligne suivante n-1, décrivez l'autoroute dans le pays T (la route dans le pays T doit être n-1)

Chaque ligne a trois nombres entiers Pi, Qi, Di, indiquant qu'il y a une autoroute entre la ville Pi et la ville Qi, et la longueur est de Di kilomètres.

Format de
sortie Affiche un entier, qui indique combien le ministre J dépense le plus sur la route.

Exemple d'entrée 1
5
1 2 2
1 3 1
2 4 5
2 5 4
Exemple de sortie 1
135
format de sortie Le
ministre J de la ville 4 à la ville 5 coûtera 135 péages.

Analyse du problème

Récursion violente 25 points

#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;
}

Méthode deux deux fois 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;
}

 

Je suppose que tu aimes

Origine blog.csdn.net/weixin_44566432/article/details/115180761
conseillé
Classement