#include <iostream>
#include <iomanip>
#include <fstream>
#include <string>
#include <cstdlib>
using namespace std;
int** read_io(int *pn, int *pm);
int** init_io(int* pm);
void print_io(int* pm, int** matrix);
int** sm_matr_init(int* pn, int* pm, int** matrix);
void show_sm_matr(int* pn, int* pm, int** matrix);
void fill_sm(int* pn, int* pm, int** matrix, int** iofile);
int** inc_matr_init(int* pn, int* pm, int** matrix);
void show_inc_matr(int* pn, int* pm, int** matrix);
void fill_inc(int* pn, int* pm, int** matrix, int** iofile);
void put_in_sm_matr(int* pn, int* pm, int** matrix, string name);
void put_in_inc_matr(int* pn, int* pm, int** matrix, string name);
int* vertex_degree_by_inc_matr(int* pn, int* pm, int** matrix);
void print_vertex_degree(int* pn, int* pm, int* matrix);
void io_vertex_degree(int* pn, int* pm, int* matrix, string name);
void discover_vertex_degree(int* pn, int* pm, int* matrix);
void fill_inc_matr_2(int* pn, int* pm, int** matrix, int** iofile);
void fill_sm_matr_2(int* pn, int* pm, int** matrix, int** iofile);
int* exit_halfsteps(int* pn, int* pm, int** matrix, int** iofile);
int* enter_halfsteps(int* pn, int* pm, int** matrix, int** iofile);
void print_exit_halfsteps(int* pn, int* pm, int* matrix);
void print_enter_halfsteps(int* pn, int* pm, int* matrix);
void put_in_exit_enter_halfsteps(int* pn, int* pm, int* matrix, int* arr, string name);
void del_1d(int* matrix);
void del_read_io(int* pn, int* pm, int** matrix);
void del_inc_sm_matr_init(int* pn, int* pm, int** matrix);
int main()
{
setlocale(LC_ALL, "ru");
int n = 0;
int m = 0;
int* pn = &n; //Вершини
int* pm = &m; //Ребра
//switch menu
cout << "Введите 1 для работы с неориентированым графом" << endl;
cout << "Введите 2 для работы с ориентированым графом" << endl;
int ll;
cin.clear();
cin >> ll;
cout << "Введите расположение или название входного файла(если находится в папке проекта) вмесме с '.txt' : ";
int** listof = read_io(pn, pm);
switch (ll) {
case(1): {//first part
int** sm_matr = sm_matr_init(pn, pm, listof);//init matrix
int** inc_matr = inc_matr_init(pn, pm, listof);//init matrix
cout << "Введите 1 что бы вывести матрицу смежности и матрицу инцедентности" << endl;
cout << "Введите 2 что бы вывести степень вершин графа" << endl;
cout << "Введите 3 что бы вывести изолированные и конечные вершины графа" << endl;
int num;
cin.clear();
cin >> num;
switch (num) {
case(1): {
fill_sm(pn, pm, sm_matr, listof);
fill_inc(pn, pm, inc_matr, listof);
cout << "Введите 1 для вывода матрицы, 2 для записи в файл или 3 для выполнения 1 и 2." << endl;
int n;
cin.clear();
cin >> n;
switch (n) {
case(1): {
cout << "Матрица смежности:" << endl;
show_sm_matr(pn, pm, sm_matr);
cout << "Матрица инцедентности:" << endl;
show_inc_matr(pn, pm, inc_matr);
break;
}
case(2): {//!!!!!!!!!!!!!!!!!!!!!!!!
cout << "Введите расположение или название файла для результата(если находится в папке проекта) вмесме с '.txt' : ";
cin.ignore(32767, '\n');
string name;
getline(cin, name);
put_in_sm_matr(pn, pm, sm_matr, name);
put_in_inc_matr(pn, pm, inc_matr, name);
break;
}
case(3): {//!!!!!!!!!!!!!!!!!!!!!!
cout << "Введите расположение или название файла для результата(если находится в папке проекта) вмесме с '.txt' : ";
cin.ignore(32767, '\n');
string name;
getline(cin, name);
put_in_sm_matr(pn, pm, sm_matr, name);
cout << "Матрица смежности:" << endl;
show_sm_matr(pn, pm, sm_matr);
break;
}
}
break;
}
case(2): {
//stepin vershini
fill_inc(pn, pm, inc_matr, listof);
int* stepin = vertex_degree_by_inc_matr(pn, pm, inc_matr);
cout << "Введите 1 для вывода степеней вершин, 2 для записи в файл или 3 для выполнения 1 и 2." << endl;
int numl;
cin.clear();
cin >> numl;
switch (numl) {
case(1): {
print_vertex_degree(pn, pm, stepin);
break;
}
case(2): {//!!!!!!!!!!!!!!!!!!
cout << "Введите расположение или название файла(если находится в папке проекта) вмесме с '.txt' : ";
cin.ignore(32767, '\n');
string name;
getline(cin, name);
io_vertex_degree(pn, pm, stepin, name);
break;
}
case(3): {//!!!!!!!!!!!!!!!!!!!!
cout << "Введите расположение или название файла(если находится в папке проекта) вмесме с '.txt' : ";
cin.ignore(32767, '\n');
string name;
getline(cin, name);
io_vertex_degree(pn, pm, stepin, name);
print_vertex_degree(pn, pm, stepin);
break;
}
del_1d(stepin);
break;
}
break;
}
case(3): {
cout << "Висячие и изолированные вершины: " << endl;
fill_inc(pn, pm, inc_matr, listof);
int* stepin = vertex_degree_by_inc_matr(pn, pm, inc_matr);
discover_vertex_degree(pn, pm, stepin);
del_1d(stepin);
break;
}
break;
}
del_read_io(pn, pm, listof);
del_inc_sm_matr_init(pn, pm, sm_matr);
del_inc_sm_matr_init(pn, pm, inc_matr);
break;
}
case(2): {//second part
int** sm_matr = sm_matr_init(pn, pm, listof);//init matrix
int** inc_matr = inc_matr_init(pn, pm, listof);//init matrix
cout << "Введите 1 что бы вывести матрицу смежности и матрицу инцедентности" << endl;
cout << "Введите 2 что бы вывести полустепени исхода и полустепени захода" << endl;
//
int num;
cin.clear();
cin >> num;
switch (num) {
case(1): {
fill_sm_matr_2(pn, pm, sm_matr, listof);
fill_inc_matr_2(pn, pm, inc_matr, listof);
cout << "Введите 1 для вывода матрицы, 2 для записи в файл или 3 для выполнения 1 и 2." << endl;
int n;
cin.clear();
cin >> n;
switch (n) {
case(1): {
cout << "Матрица смежности:" << endl;
show_sm_matr(pn, pm, sm_matr);
cout << "Матрица инцедентности:" << endl;
show_inc_matr(pn, pm, inc_matr);
break;
}
case(2): {//!!!!!!!!!!!!!!!!!!!!!!
cout << "Введите расположение или название файла(если находится в папке проекта) вмесме с '.txt' : ";
cin.ignore(32767, '\n');
string name;
getline(cin, name);
put_in_sm_matr(pn, pm, sm_matr, name);
put_in_inc_matr(pn, pm, inc_matr, name);
break;
}
case(3): {//!!!!!!!!!!!!!!!!!!!!!!
cout << "Введите расположение или название файла(если находится в папке проекта) вмесме с '.txt' : ";
cin.ignore(32767, '\n');
string name;
getline(cin, name);
put_in_sm_matr(pn, pm, sm_matr, name);
put_in_inc_matr(pn, pm, inc_matr, name);
cout << "Матрица смежности:" << endl;
show_sm_matr(pn, pm, sm_matr);
cout << "Матрица инцедентности:" << endl;
show_inc_matr(pn, pm, inc_matr);
break;
}
}
break;
}
case(2): {
fill_inc_matr_2(pn, pm, inc_matr, listof);
int* gg = exit_halfsteps(pn, pm, inc_matr, listof);
int* ll = enter_halfsteps(pn, pm, inc_matr, listof);
cout << "Введите 1 для вывода результата, 2 для записи в файл или 3 для выполнения 1 и 2." << endl;
int num;
cin.clear();
cin >> num;
switch (num) {
case(1): {
print_exit_halfsteps(pn, pm, gg);
cout << endl;
print_enter_halfsteps(pn, pm, ll);
}
case(2): {
cout << "Введите расположение или название файла(если находится в папке проекта) вмесме с '.txt' : ";
cin.ignore(32767, '\n');
string name;
getline(cin, name);
put_in_exit_enter_halfsteps(pn, pm, gg, ll, name);
}
case(3): {
cout << "Введите расположение или название файла(если находится в папке проекта) вмесме с '.txt' : ";
cin.ignore(32767, '\n');
string name;
getline(cin, name);
put_in_exit_enter_halfsteps(pn, pm, gg, ll, name);
print_exit_halfsteps(pn, pm, gg);
cout << endl;
print_enter_halfsteps(pn, pm, ll);
}
}
del_1d(gg);
del_1d(ll);
break;
}
}
del_read_io(pn, pm, listof);
del_inc_sm_matr_init(pn, pm, sm_matr);
del_inc_sm_matr_init(pn, pm, inc_matr);
//
break;
}
}
}
int** read_io(int *pn, int *pm)
{
ifstream file;
cin.ignore(32767, '\n');
string name;
getline(cin, name); //undirected graph input.txt
file.open(name);
if (file.is_open() == 0) {
cout << "Ошибка открылия файла!";
exit(0);
}
else {
cout << "Файл открыт." << endl;
int num;
int n, m;
file >> n >> m;
cout << "Количество вершин: " << n << endl;
cout << "Количество ребер: " << m << endl;
*pn = n;
*pm = m;
//Inin matr for io input
int** arrl = init_io(pm);
while (!file.eof()) {
for (int i = 0; i < *pm; i++) {
for (int j = 0; j < 2; j++) {
file >> num;
arrl[i][j] = num;
}
}
}
cout << "Список ребер:" << endl;
print_io(pm, arrl); //print io
return arrl;
}
file.close();
}
int** init_io(int* pm) {//del init io
int** arr = new int* [*pm];
for (int i = 0; i < *pm; i++) {
arr[i] = new int[2];
}
return arr;
}
void print_io(int* pm, int** matrix)
{
for (int i = 0; i < *pm; i++) {
for (int j = 0; j < 2; j++) {
cout << setw(4) << matrix[i][j];
}
cout << endl;
}
}
int** sm_matr_init(int *pn, int *pm, int** matrix)
{
int** arr = new int* [*pn];
for (int i = 0; i < *pn; i++) {
arr[i] = new int[*pn];
}
for (int i = 0; i < *pn; i++) {
for (int j = 0; j < *pn; j++) {
arr[i][j] = 0;
}
}
return arr;
}
void show_sm_matr(int* pn, int* pm, int** matrix)
{
for (int i = 0; i < *pn; i++) {
for (int j = 0; j < *pn; j++) {
cout << setw(4) << matrix[i][j];
}
cout << endl;
}
}
void put_in_sm_matr(int* pn, int* pm, int** matrix, string name) {
ofstream file;
file.open(name);
if (file.is_open() == 0) {
cout << "Ошибка открылия файла!";
exit(0);
}
if (file.is_open())
{
file << "Матрица смежности:" << endl;
for (int i = 0; i < *pn; i++) {
for (int j = 0; j < *pn; j++) {
file << setw(4) << matrix[i][j];
}
file << endl;
}
file.close();
}
}
void fill_sm(int* pn, int* pm, int** matrix, int** iofile)
{
for (int j = 0; j < *pm; j++) {
matrix[iofile[j][0] - 1][iofile[j][1] - 1] = 1;
}
for (int i = 0; i < *pn; i++) {
for (int h = i; h < *pn; h++) {
matrix[h][i] = matrix[i][h];
}
}
}
int** inc_matr_init(int* pn, int* pm, int** matrix)
{
int** arr = new int* [*pn];
for (int i = 0; i < *pn; i++) {
arr[i] = new int[*pm];
}
for (int i = 0; i < *pn; i++) {
for (int j = 0; j < *pm; j++) {
arr[i][j] = 0;
}
}
return arr;
}
void show_inc_matr(int* pn, int* pm, int** matrix)
{
for (int i = 0; i < *pn; i++) {
for (int j = 0; j < *pm; j++) {
cout << setw(4) << matrix[i][j];
}
cout << endl;
}
}
void put_in_inc_matr(int* pn, int* pm, int** matrix, string name) {
ofstream file;
file.open(name, std::ios::app);
if (file.is_open() == 0) {
cout << "Ошибка открылия файла!";
exit(0);
}
if (file.is_open())
{
file << "Матрица инцедентности:" << endl;
for (int i = 0; i < *pn; i++) {
for (int j = 0; j < *pm; j++) {
file << setw(4) << matrix[i][j];
}
file << endl;
}
file.close();
}
}
void fill_inc(int* pn, int* pm, int** matrix, int** iofile)
{
for (int i = 0; i < *pn; i++) {
for (int j = 0; j < *pm; j++) {
matrix[iofile[j][0] - 1][j] = 1;
matrix[iofile[j][1] - 1][j] = 1;
}
}
}
int* vertex_degree_by_inc_matr(int* pn, int* pm, int** matrix)
{
int* arr = new int[*pn];
for (int i = 0; i < *pn; i++) {
int sum = 0;
for (int j = 0; j < *pm; j++) {
sum = sum + matrix[i][j];
}
arr[i] = sum;
}
return arr;
}
void print_vertex_degree(int* pn, int* pm, int* matrix) {
for (int i = 0; i < *pn; i++) {
cout << "Степень вершины " << i + 1 << " равна " << matrix[i] << endl;
}
bool logic = 0;
for (int i = 1; i < *pn; i++) {
if (matrix[i] == matrix[i - 1]) {
logic = true;
}
else {
logic = false;
break;
}
}
if (logic == true) {
cout << "Граф однородный степеня " << matrix[0];
}
}
void io_vertex_degree(int* pn, int* pm, int* matrix, string name) {
ofstream file;
file.open(name);
if (file.is_open() == 0) {
cout << "Ошибка открылия файла!";
exit(0);
}
if (file.is_open())
{
for (int i = 0; i < *pn; i++) {
file << "Степень вершины " << i + 1 << " равна " << matrix[i] << endl;
}
file.close();
}
}
void discover_vertex_degree(int* pn, int* pm, int* matrix)
{
for (int i = 0; i < *pn; i++) {
if (matrix[i] == 0) {
cout << i + 1 << " изолированая вершина." << endl;
}
}
for (int i = 0; i < *pn; i++) {
if (matrix[i] == 1) {
cout << i + 1 << " висячая вершина." << endl;
}
}
}
//2 part
void fill_inc_matr_2(int* pn, int* pm, int** matrix, int** iofile)
{
for (int i = 0; i < *pn; i++) {
for (int j = 0; j < *pm; j++) {
matrix[iofile[j][0] - 1][j] = 1;
matrix[iofile[j][1] - 1][j] = -1;
}
}
}
void fill_sm_matr_2(int* pn, int* pm, int** matrix, int** iofile)
{
for (int j = 0; j < *pm; j++) {
matrix[iofile[j][0] - 1][iofile[j][1] - 1] = 1;
}
}
int* exit_halfsteps(int* pn, int* pm, int** matrix, int** iofile) {
int* arr = new int[*pn];
for (int i = 0; i < *pn; i++) {
int sum = 0;
for (int j = 0; j < *pm; j++) {
if (matrix[i][j] == 1) {
sum = sum + 1;
}
}
arr[i] = sum;
}
return arr;
}
void print_exit_halfsteps(int* pn, int* pm, int* matrix) {
for (int i = 0; i < *pn; i++) {
cout << "Наполстепень выхода вершины " << i + 1 << " равно " << matrix[i] << endl;
}
}
int* enter_halfsteps(int* pn, int* pm, int** matrix, int** iofile){
int* arr = new int[*pn];
for (int i = 0; i < *pn; i++) {
int sum = 0;
for (int j = 0; j < *pm; j++) {
if (matrix[i][j] == -1) {
sum = sum + 1;
}
}
arr[i] = sum;
}
return arr;
}
void print_enter_halfsteps(int* pn, int* pm, int* matrix) {
for (int i = 0; i < *pn; i++) {
cout << "Наполстепень захода вершины " << i + 1 << " равно " << matrix[i] << endl;
}
}
void put_in_exit_enter_halfsteps(int* pn, int* pm, int* matrix, int* arr, string name)
{
ofstream file;
file.open(name);
if (file.is_open() == 0) {
cout << "Ошибка открылия файла!";
exit(0);
}
if (file.is_open())
{
for (int i = 0; i < *pn; i++) {
file << "Наполстепень захода вершины " << i + 1 << " равно " << matrix[i] << endl;
}
file << endl;
for (int i = 0; i < *pn; i++) {
file << "Наполстепень выхода вершины " << i + 1 << " равно " << matrix[i] << endl;
}
file.close();
}
}
void del_1d(int* matrix)
{
delete[] matrix;
}
void del_read_io(int* pn, int* pm, int** matrix)
{
for (int i = 0; i < *pm; i++) {
delete[] matrix[i];
}
delete[] matrix;
}
void del_inc_sm_matr_init(int* pn, int* pm, int** matrix)
{
for (int i = 0; i < *pn; i++) {
delete[] matrix[i];
}
delete[] matrix;
}