题目
大臣的旅费
很久以前,T王国空前繁荣。为了更好地管理国家,王国修建了大量的快速路,用于连接首都和王国内的各大城市。大臣J从城市4到城市5要花费135的路费。
思想
根据题目的特性,只会有n-1条边,考虑到本图非常稀疏,采用结构体存顶点和值。本题最主要其实就是求两点的最长路径,本思想是求每一个叶子节点网上回溯,回溯到分支节点时减去回溯的支数,最后总能回溯到最后一个节点(度数最大的那个节点,若有多个度数相同的节点,本程序是任取一个来处理)。
程序实现
#include<stdlib.h>
#include<stdio.h>
struct Distance_notes{
int child_nodes_number;
int max_distance;
int second_distance;
};
struct Map_notes{
int source;
int destination;
int distance;
};
int total_number;
struct Distance_notes* dn;
struct Map_notes* map_nodes;
void execute_distance()
{
int i,j;
int temp;
for(i=0;i<total_number;i++){
if(dn[i].child_nodes_number > 1){
for(j=0;j<total_number-1;j++){
if(map_nodes[j].source == i+1){
if(dn[map_nodes[j].destination-1].child_nodes_number == 1){
temp = map_nodes[j].distance + dn[map_nodes[j].destination-1].max_distance;
if(dn[i].max_distance <= temp){
dn[i].second_distance = dn[i].max_distance;
dn[i].max_distance = temp;
dn[i].child_nodes_number--;
dn[map_nodes[j].destination-1].child_nodes_number--; //avoid double execute
continue;
}
if(dn[i].second_distance < temp){
dn[i].second_distance = temp;
dn[i].child_nodes_number--;
dn[map_nodes[j].destination-1].child_nodes_number--;
continue;
}
dn[i].child_nodes_number--;
dn[map_nodes[j].destination-1].child_nodes_number--;
}
}
if(map_nodes[j].destination== i+1){
if(dn[map_nodes[j].source-1].child_nodes_number == 1){
temp = map_nodes[j].distance + dn[map_nodes[j].source-1].max_distance;
if(dn[i].max_distance<= temp){
dn[i].second_distance = dn[i].max_distance;
dn[i].max_distance = temp;
dn[i].child_nodes_number--;
dn[map_nodes[j].source-1].child_nodes_number--;
continue;
}
if(dn[i].second_distance < temp){
dn[i].second_distance = temp;
dn[i].child_nodes_number--;
dn[map_nodes[j].source-1].child_nodes_number--;
continue;
}
dn[i].child_nodes_number--;
dn[map_nodes[j].source-1].child_nodes_number--;
}
}
}
}
}
}
int main(void)
{
scanf("%d", &total_number);
dn = (struct Distance_notes *)malloc(sizeof(struct Distance_notes) * total_number);
map_nodes =(struct Map_notes *)malloc(sizeof(struct Map_notes) * (total_number-1));
//initialization
int i;
for(i=0;i<total_number;i++){
dn[i].child_nodes_number= 0;
dn[i].max_distance = 0;
dn[i].second_distance = 0;
}
for(i=0;i<total_number-1;i++){
scanf("%d %d %d", &map_nodes[i].source, &map_nodes[i].destination, &map_nodes[i].distance);
dn[map_nodes[i].source-1].child_nodes_number++;
dn[map_nodes[i].destination-1].child_nodes_number++;
}
for(i=0;i<total_number;i++){
if(dn[i].child_nodes_number > 1){
execute_distance();
i = -1;
}
}
int sum=0;
int temp;
for(i=0;i<total_number;i++){
temp=dn[i].max_distance + dn[i].second_distance;
//printf("distance %d %d\n", dn[i].max_distance ,dn[i].second_distance);
if(temp>sum){
sum=temp;
}
}
printf("\n\n%d %d\n", sum, sum*10+sum*(1+sum)/2);
free(dn);
free(map_nodes);
return 0;
}
2014-03-30 大臣的旅费(回溯思想,最长路径),布布扣,bubuko.com
原文:http://blog.csdn.net/sykpour/article/details/22596405