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