Переписать код с С++ на С# - C#

Узнай цену своей работы

Формулировка задачи:

Здравствуйте. Прошу помощи с переписыванием кода с другого языка.
#include <iostream>
#include <vector>
 
using namespace std;
 
int n1; //количество вершин в первой доле графа
int n2; //количество вершин во второй доле графа
int m; //количество ребер в графе
vector<int> *adj; //список смежности
vector<bool> used; //массив для хранения информации о пройденных и не пройденных вершинах
int mtSize = 0; //размер максимального паросочетания
vector<int> mt; //массив для хранения ребер, образующих максимальное паросочетание
    
//алгоритм Куна поиска максимального паросочетания
bool kuhn(int v) { 
    //если вершина является пройденной, то не производим из нее вызов процедуры
    if (used[v]) { 
        return false;
    }
    used[v] = true; //помечаем вершину первой доли, как пройденную
    //просматриваем все вершины второй доли, смежные с рассматриваемой вершиной первой доли   
    for (int i = 0; i < adj[v].size(); ++i) {
        int w = adj[v][i];
    //нашли увеличивающую цепь, добавляем ребро (v, w) в паросочетание
        if (mt[w] == -1 || kuhn(mt[w])) {
            mt[w] = v;
            return true;
    }
    }
    return false;
}   
 
//процедура считывания входных данных с консоли
void readData() {
    //считываем количество вершин в первой и второй доли и количество ребер графа
    scanf("%d %d %d", &n1, &n2, &m);
    //инициализируем список смежности размерности n1
    adj = new vector<int>[n1];  
 
    //считываем граф, заданный списком ребер
    for (int i = 0; i < m; ++i) {
        int v, w;
        scanf("%d %d", &v, &w);
        v--;
        w--;
        //добавляем ребро (v, w) в граф
        adj[v].push_back(w);
    }
    used.assign(n1, false);  
    mt.assign(n2, -1);
}
 
void solve() {
    //находим максимальное паросочетание
    for (int v = 0; v < n1; ++v) {
    used.assign(n1, false);
    //если нашли увеличивающую цепь, 
    //то размер максимального паросочетания увеличиваем на 1
        if (kuhn(v)) {
            mtSize++;
        }
    }
}
 
void printData() {
    printf("%d\n", mtSize);
    for (int i = 0; i < n2; ++i) {
    if (mt[i] != -1) {
        printf("%d %d\n", mt[i] + 1, i + 1);
        }
    }
}
 
int main()
{
    readData();
    solve();
    printData();
    return 0;
}
Тема еще актуальна, у меня возникают проблемы с областями видимости этих глобальных переменных.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace Para
{
    class Program
    {
        static void Main(string[] args)
        {
 
        }
 
        static bool Kohn(List<bool> used, List<int> adj, List<int> mt, int v)
        {
            //если вершина пройдена, то не производим из нее вызов процедуры
            if (used[v])
            {
                return false;
            }
            used[v] = true; //помечаем вершину первой доли, как пройденную
            //просматриваем все вершины второй доли, смежные с рассматриваемой вершиной первой доли 
            for (int i = 0; i < adj.Count; i++)
            {
                int w = adj[v, i]; //тут ошибка
                //нашли увеличивающую цепь, добавляем ребро (v, w) в паросочетание
                if (mt[w] == -1 || Kohn(used, adj, mt, v))
                {
                    mt[w] = v;
                    return true;
                }
            }
            return false;
        }
        //процедура считывания входных данных с консоли
        static int ReadData()
        {
            //считываем количество вершин в первой и второй доли и количество ребер графа
            Console.WriteLine("Input n1");
            int n1 = Console.Read();
            Console.WriteLine("Input n2");
            int n2 = Console.Read();
            Console.WriteLine("Input m");
            int m = Console.Read();
            //инициализируем список смежности размерности n1
            List<int>[] adj = new List<int>[n1];
            for (int i = 0; i < m; i++)
            {
                int v, w;
                Console.WriteLine("Input v and w:");
                v = Console.Read();
                w = Console.Read();
                v--;
                w--;
                adj[v].Add(w);
            }
            //used.assign(n1, false);  -здесь не знаю как переписать
            //mt.assign(n2, -1);
            return n1;
        }
        static void Solve(int n1, List<bool> used, List<int> adj, List<int> mt)
        {
            int maxSize =0;
            //находим максимальное паросочетание
            for (int v = 0; v < n1; v++)
            {
                //used.assign(n1, false);
                if (Kohn(used, adj, mt, v))
                    maxSize++;
            }
        }
        static void Print()
        {
            //тут е понятно как создать область видимости для все полученных данных,
            //чтобы их распечатать
        }
    }
}
Тема еще актуальна

Решение задачи: «Переписать код с С++ на С#»

textual
Листинг программы
//used.assign(n1, false);  -здесь не знаю как переписать
            //mt.assign(n2, -1);

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 4.2 из 5