Переписать код с С++ на С# - 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);
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д