5. 運算對稱矩陣以求出分割值

Console.Write("Enter filename:");
var text = File.ReadAllLines(AppDomain.CurrentDomain.BaseDirectory + "\\" + Console.ReadLine());
Console.WriteLine("所輸入的對稱矩陣:");
double[,] data = new double[text.Length, text[0].Split("  ").Length];
int i = 0;
foreach (var item in text)
{
    Console.WriteLine(item);
    var z = item.Split("  ");
    for (global::System.Int32 j = 0; j < z.Length; j++)
    {
        data[i, j] = double.Parse(z[j]);
    }
    i++;
}
bool updated;
do
{
    updated = false;
    for (int x = 0; x < data.GetLength(0); x++)
    {
        for (int y = 0; y < data.GetLength(1); y++)
        {
            double max = Double.MinValue;
            for (int j = 0; j < data.GetLength(1); j++)
            {
                max = Math.Max(max, Math.Min(data[x, j], data[j, y]));
            }
            if (data[x, y] != max)
            {
                updated = true;
                data[x, y] = max;
            }
        }
    }
} while (updated);
Console.WriteLine();
Console.WriteLine("經過幾次遞移律(Transitive Closure)運算後的對稱矩陣:");
for (int j = 0; j < data.GetLength(0); j++)
{
    for (int k = 0; k < data.GetLength(1); k++)
    {
        Console.Write($"{data[j, k]:0.00}  ");
    }
    Console.WriteLine();
}

Console.WriteLine("\n對稱矩陣的右上半每列最大值:");

var values = new HashSet<double>();
for (int j = 0; j < data.GetLength(0)-1; j++)
{
    var max = Double.MinValue;
    for (int k = 1 + j; k < data.GetLength(1); k++)
    {
        max = Math.Max(max, data[j, k]);
    }
    values.Add(max);
    Console.Write($"{max:0.00}  ");
}
Console.WriteLine("\n對稱矩陣的右上半每列最大值的排序(各值只出現一次):");
var list = new List<double>(values);
list.Sort();
foreach (var item in list)
{
    Console.Write($"{item:0.00}  ");
}

Last updated