public static void Main() { int[] NMR = IntLine(); int N = NMR[0], M = NMR[1], R = NMR[2]; int[] rR = IntLine().Select(v => v - 1).ToArray(); int[,] Edge = new int[N, N]; for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { Edge[i, j] = (i == j ? 0 : INF); } } for (int i = 0; i < M; i++) { int[] box = IntLine(); Edge[box[0] - 1, box[1] - 1] = Math.Min(Edge[box[0] - 1, box[1] - 1], box[2]); Edge[box[1] - 1, box[0] - 1] = Math.Min(Edge[box[1] - 1, box[0] - 1], box[2]); } //WF for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { for (int k = 0; k < N; k++) { Edge[j, k] = Math.Min(Edge[j, k], Edge[j, i] + Edge[i, k]); } } } Permutation p = new Permutation(rR.ToList()); p.PermList = new List <List <int> >(); p.Calc(new List <int>()); long ans = INF; foreach (var l in p.PermList) { long b = 0; for (int i = 1; i < R; i++) { b += Edge[l[i - 1], l[i]]; } ans = Math.Min(ans, b); } Console.WriteLine(ans); }
public static IEnumerable <String> PermutationsList(this IEnumerable <char> source) { return(Permutation.Calc(false, source.ToArray())); }
public static IEnumerable <String> CircularList(this IEnumerable <char> source) { return(Permutation.Calc(true, source.ToArray())); }