旅行商问题(dfs)

旅行商来到了一个新的国家,这个国家有N个城市,他们直接由N-1条道路相连接,每条道路的长度不尽相同
旅行商现在在1号城市,若他要每一个城市都游览一遍,他需要行走的最短路程是多少?

解析

如果用dfs解决的话,需要逆向考虑这个问题,可以想到,肯定有路要走两次,有一条路只走一次即可,那么我们就希望这条只走一次的路可以尽可能地长,所以dfs找到这条最长的路就好了,然后其他的路走两次,这条路只需要走一次,总的路程就是sum*2-ans(ans是这条最长的路)


import java.io.BufferedReader;
import java.io.*;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

public class Main {
	static int N=50000*2+10;
	static int []head=new int [N];
	static int []next =new int [N];
	static int []to= new int [N];
	static int []dis =new int [N];
	static int [] d=new int [N];
	static int now=0,ans=0;
	static void add(int x ,int y,int z) {
		now++;
		to[now]=y;
		dis[now]=z;
		next[now]=head[x];
		head[x]=now;
	}
	static void dfs(int x,int pre,int k) {
		//System.out.println(now);
		ans=Math.max(ans,k);
		for(int i=head[x];i!=0;i=next[i]) {
			int y=to[i];
			if(y!=pre) {
				dfs(y,x,k+dis[i]);
			}
		}
	}
	public static void main(String []args) throws IOException {
		BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); 
		String str=br.readLine();
		int n=Integer.parseInt(str);
		n--;
		int sum=0;
		while(n--!=0) {
			str=br.readLine();
			String []s =str.split(" ");
			int x=Integer.parseInt(s[0]);
			int y=Integer.parseInt(s[1]);
			int z =Integer.parseInt(s[2]);
			add(x,y,z);
			add(y,x,z);
			sum+=z;
		}
		dfs(1,-1,0);
		System.out.println(sum*2-ans);
	}
}


  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值