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