Эйлеров граф и проверка матрицы инцидентности - C#
Формулировка задачи:
Ребята, нужна помощь. Завтра сдавать программу, а доделать не знаю как.
В общем программа из файла считывает матрицу инцидентности, далее с ней работает. Перед тем, как программа начнет работать с матрицей, мне надо, чтобы она проверила эту самую матрицу, чтобы она действительно являлась инцидентной.
Признак инцидентности: любой из столбцов матрицы содержит две единицы, либо 1 и -1(если ориентированное ребро), все остальные в нем(столбце) - нули.
Прочитала много тем на форуме, поняла, что надо в каждом столбце посчитать сумму. И если эта сумма в каждом из столбцов будет равна или больше 3-х, то в новый файл вывести сообщение, типа : "проверьте правильность матрицы" и далее с ней действий не производить. А если все нормально с матрицей, то переходить, собственно, к следующей части программы.
Как дописать это в код, правильно дописать, не знаю. Помогите, пожалуйста.
Прикрепляю файл с матрицей, которая является инцидентной. Его нужно переместить в папку "Debug", чтобы программа с ним работала.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
namespace Эйлеров_Граф
{
class Program
{
static void Main(string[] args)
{
int i, j, entry_top, out_top, row, col, s, s2; bool yes = true;
string str1 = "", str2;
string path = "graph.txt";
StreamReader matrix = new StreamReader(File.Open(path, FileMode.Open));
str1 = matrix.ReadLine();
s = str1.Length;
int[] mas = new int[s];
mas = Stroka(str1, s);
row = mas[0];
col = mas[1];
int[,] matrixInc = new int[row, col];
// считывание матрицы инцидентности
for (i = 0; i < row; i++)
{
str2 = matrix.ReadLine();
s2 = str2.Length;
int[] mas2 = new int[col];
mas2 = Stroka(str2, s2);
for (j = 0; j < col; j++)
matrixInc[i, j] = mas2[j];
}
matrix.Close();
// Проверка на существование в графе цикла
for (i = 0; i < row; i++)
{
entry_top = 0;
out_top = 0;
for (j = 0; j < col; j++)
{
if (matrixInc[i, j] > 0) entry_top++;
if (matrixInc[i, j] < 0) out_top++;
}
if (out_top == 0)
{
if (entry_top % 2 != 0) yes = false;
}
else
{
if ((entry_top + out_top) % 2 != 0) yes = false;
if (out_top > ((int)((entry_top + out_top) / 2))) yes = false;
}
}
if (yes == false)
{
string pas = "result.txt";
using (var stream = new StreamWriter(pas))
stream.WriteLine("Граф не является эйлеровым.");
}
else
{
string pas = "result.txt";
using (var stream = new StreamWriter(pas))
stream.WriteLine("Граф является эйлеровым. Поздравляем!!");
}
}
// вычленение элементов из строки
public static int[] Stroka(string str, int n)
{
string str2 = "";
int i, k = 0;
int[] massiv = new int[n];
for (i = 0; i < n; i++)
{
if (str[i] != ' ') str2 += str[i];
if ((str[i] == ' ') || (i == n - 1))
{
massiv[k] = int.Parse(str2);
str2 = "";
k++;
}
}
return massiv;
}
}
}Решение задачи: «Эйлеров граф и проверка матрицы инцидентности»
textual
Листинг программы
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
namespace Эйлеров_Граф
{
class Program
{
public static void Main(string[] args)
{
int i, j, entry_top, out_top, row, col, s, s2, sum; bool yes = true;
string str1 = "", str2;
string path = "graph.txt";
StreamReader matrix = new StreamReader(File.Open(path, FileMode.Open));
str1 = matrix.ReadLine();
s = str1.Length;
int[] mas = new int[s];
mas = Stroka(str1, s);
row = mas[0];
col = mas[1];
int[,] matrixInc = new int[row, col];
// считывание матрицы инцидентности
for (i = 0; i < row; i++)
{
str2 = matrix.ReadLine();
s2 = str2.Length;
int[] mas2 = new int[col];
mas2 = Stroka(str2, s2);
for (j = 0; j < col; j++)
matrixInc[i, j] = mas2[j];
}
//считаем сумму чисел в каждом столбце
//для всех столбцов, начиная с 0 до последнего выполняем цикл
for (j = 0; j < matrixInc.GetLength(1); j++)
{
sum = 0;
// для всех строк, начиная с 0 до последней выполняем цикл
for (i = 0; i < matrixInc.GetLength(0); i++)
{
// присваиваем значению sum сумму элементов всех строк данного столбца
sum += matrixInc[i, j];
}
//в принципе, не нужный участок проги :)
Console.WriteLine("Sum in {0} column: {1}", j, sum);
}
matrix.Close();
// Проверка на существование в графе цикла
for (i = 0; i < row; i++)
{
entry_top = 0;
out_top = 0;
for (j = 0; j < col; j++)
{
if (matrixInc[i, j] > 0) entry_top++;
if (matrixInc[i, j] < 0) out_top++;
}
if (out_top == 0)
{
if (entry_top % 2 != 0) yes = false;
}
else
{
if ((entry_top + out_top) % 2 != 0) yes = false;
if (out_top > ((int)((entry_top + out_top) / 2))) yes = false;
}
}
if (yes == false)
{
string pas = "result.txt";
using (var stream = new StreamWriter(pas))
stream.WriteLine("Граф не является эйлеровым.");
}
else
{
string pas = "result.txt";
using (var stream = new StreamWriter(pas))
stream.WriteLine("Граф является эйлеровым. Поздравляем!!");
}
}
// вычленение элементов из строки
public static int[] Stroka(string str, int n)
{
string str2 = "";
int i, k = 0;
int[] massiv = new int[n];
for (i = 0; i < n; i++)
{
if (str[i] != ' ') str2 += str[i];
if ((str[i] == ' ') || (i == n - 1))
{
massiv[k] = int.Parse(str2);
str2 = "";
k++;
}
}
return massiv;
}
}
}