С++ начинаю только изучать,поэтому не все ясно...
мне нужны комменты к каждой строке,пожалуйста,так как надо переписать эту программу на шарп...это реализация алгоритма Косарайю (поиск компонет сильной связности в орграфе)
Код: Выделить всё
#include "stdafx.h"
#include "iostream"
using namespace std;
// Основные переменные
int Nn;
int S[10];
int F[10];
int FIn[20];
char Color[10];
// Структура графа
struct Node
{
int No;
Node* Next;
}
*Beg, *Np, *Np1, *Temp, *Temp1, *Temp2;
Node *Graph[50];
Node *Grapht[50];
// Создаем структуру
Node* Create(int N)
{
Np = new Node;
Np->No = N;
Np->Next = NULL;
return Np;
}
// Вставляем вершины
void Insert(Node* Np)
{
if (Beg == NULL)
Beg = Np;
else
{
Temp = Beg;
Beg = Np;
Np->Next = Temp;
}
}
// Выводим граф
void Display(Node* Np)
{
while(Np != NULL)
{
cout<<Np->No<<"-";
Np = Np->Next;
}
}
// Удаляем вершины
void Del(Node* Np, Node* Np1)
{
Np->Next = Np1->Next;
delete Np1;
}
// Проверяем или мы уже здесь были
void Visit(int J, Node* A[])
{
Color[J] = 'g';
Temp = A[J];
while(Temp != NULL)
{
int V = Temp->No;
if(Color[V] == 'w')
{
Visit(V, A);
Temp = A[J]->Next;
}
else
Temp = Temp->Next;
}
cout<<J<<",";
Color[J] = 'b';
}
// Деревья, которые выбираются в результате, представляют собой сильные компоненты
void DFS(int N, Node* A[])
{
for(int J = 1; J <= N; J++)
Color[J] = 'w';
for(int I = 1; I <= N; I++)
{
if(Color[I] == 'w')
Visit(I, A);
cout<<"\n";
}
}
// Инвертируем ребра исходного орграфа
void Tran(int N)
{
for(int I = 1; I <= N; I++)
{
Color[I] = 'w';
Np = Create(I);
Grapht[I] = Np;
}
for(int J = 1; J <= N; J++)
{
Temp = Graph[J]->Next;
while (Temp != NULL)
{
int X = Temp->No;
Np = Create(J);
Temp1 = Grapht[X];
Np->Next = Temp1->Next;
Temp1->Next = Np;
Temp = Temp->Next;
}
}
}
// Основная процедура алгоритма
void SCC(int N)
{
int K;
DFS(N, Graph);
for(K = 1; K <= N; K++)
{
Color[K] = 'w';
int T = F[K];
FIn[T] = K;
}
Tran(N);
for(K = (2 * N); K >= 1; K--)
if((FIn[K] != NULL) && (Color[FIn[K]]) == 'w')
{
int Z = FIn[K];
Visit(Z, Grapht);
cout<<"\n";
}
}
// Создаем сам граф
void CreateG(int N)
{
int I = 1;
char Ch = 'y';
int Sd;
Nn = 0;
int X = 0;
while(I <= N)
{
cout<<"Enter Size Of Nodes Adjacent To "<<I<<" : ";
cin>>Sd;
while(X < Sd)
{
cout<<"Enter The Adjacent Node Of Node # "<<I<<" : ";
cin>>Nn;
Create(Nn);
Insert(Np);
X++;
}
Graph[I] = Beg;
Beg = NULL;
I++;
X = 0;
}
}
// Основная программа
int main()
{
int N;
cout<<"Enter The Size Of Nodes : ";
cin>>N;
CreateG(N);
cout<<"\nResult :\n";
SCC(N);
return 0;
}