3. 在地圖中搜尋最低成本的路徑

題目自己不講清楚用什麼形式做,唉。

using System.Linq;

namespace Q3
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            var dic = new Dictionary<int, Dictionary<int, int>>();
            foreach (var item in textBox1.Text.Split('\n'))
            {
                var data = item.Split(' ');
                int from = int.Parse(data[0]);
                if (!dic.ContainsKey(from))
                {
                    dic[from] = new Dictionary<int, int>();
                }
                dic[from][int.Parse(data[1])] = int.Parse(data[2]);
            };

            var paths = new List<List<int>>();
            void run(int goal, List<int> visited)
            {
                var current = visited.Last();
                if (current == goal)
                {
                    paths.Add(visited);
                    return;
                }

                foreach (var item in dic[current])
                {
                    if (visited.Contains(item.Key)) continue;
                    var clone = new List<int>(visited);
                    clone.Add(item.Key);
                    run(goal, clone);
                }
            }
            run(7, new List<int>(new[] { 1 }));

            List<int> min = null;
            List<int> minCost = null;
            int minCostSum = int.MaxValue;

            foreach (var item in paths)
            {
                var cost = 0;
                List<int> costs = new List<int>();
                for (global::System.Int32 i = 1; i < item.Count; i++)
                {
                    cost += dic[item[i - 1]][item[i]];
                    costs.Add(dic[item[i - 1]][item[i]]);
                }

                if (cost > minCostSum)
                {
                    continue;
                }
                min = item;
                minCost = costs;
                minCostSum = cost;
            }

            textBox2.Text = $@"最低成本值總和:{minCostSum}
連線次序:{(string.Join("", min.Select(e => "\t" + e)))}
連線數值:{"\t"}0{(string.Join("", minCost.Select(e => "\t" + e)))}";
        }
    }
}

Last updated