AOJ1108 A Long Ride on a Railway

問題リンク A Long Ride on a Railway

  • 概要

N個の駅とM個の路線がある。路線には長さがある。路線の最長パスの長さとその経路を答えよ。
経路は辞書順比較で一番小さいものを答えよ。
1 <= N <= 10
1 <= M <= 20

  • 解法

グラフにおける最長パスを求めるのは普通は困難ですが、グラフが小さいので全探索が可能です。

  • ソース
import java.util.Scanner;

//A Long Ride on a Railway
public class AOJ1108 {

	int n, m, max;
	int INF = 1<<27;
	int[][] d;
	boolean[] u;
	int[] ans, trace;
	
	long f(int[] a, int n){
		long x = 0;
		for(int i=0;i<n;i++)x = x*10+(a[i]-1);
		return x;
	}
	
	void dfs(int k, int v, int dist){
		if(max==dist){
			trace[k] = v;
			long a = f(trace, k+1);
			long b = f(ans, ans.length);
			if(a<b){
				ans = new int[k+1];
				for(int i=0;i<=k;i++)ans[i]=trace[i];
			}
		}
		else if(max<dist){
			trace[k] = v;
			max = dist;
			ans = new int[k+1];
			for(int i=0;i<=k;i++)ans[i]=trace[i];
		}
		for(int i=0;i<m;i++){
			if(u[i])continue;
			if(d[i][0]!=v&&d[i][1]!=v)continue;
			trace[k] = v;
			if(d[i][0]==v){
				int t = d[i][1];
				u[i] = true;
				dfs(k+1, t, dist+d[i][2]);
				u[i] = false;
			}
			else{
				int t = d[i][0];
				u[i] = true;
				dfs(k+1, t, dist+d[i][2]);
				u[i] = false;
			}
		}
	}
	
	void run(){
		Scanner sc = new Scanner(System.in);
		for(;;){
			n = sc.nextInt();
			m = sc.nextInt();
			if((n|m)==0)break;
			d = new int[m][3];		
			for(int i=0;i<m;i++)for(int j=0;j<3;j++)d[i][j]=sc.nextInt();
			trace = new int[m];
			u = new boolean[m];
			max = 0;
			for(int i=0;i<m;i++){
				u[i] = true;
				trace[0] = d[i][0];
				dfs(1, d[i][1], d[i][2]);
				trace[0] = d[i][1];
				dfs(1, d[i][0], d[i][2]);
				u[i] = false;
			}
			System.out.println(max);
			for(int i=0;i<ans.length;i++)System.out.print(ans[i]+(i==ans.length-1?"\n":" "));
		}
	}
	
	public static void main(String[] args) {
		new AOJ1108().run();
	}
}