Переписать код с С++ на С# - 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);