Я пытаюсь реализовать следующий алгоритм для итеративного, но я не могу сделать это правильно. Может кто-нибудь, пожалуйста, помогите мне с этим. Его двухпартийный алгоритм совпадения, и у меня возникают проблемы с преобразованием функции bpm в итеративную.Преобразование рекурсивного алгоритма в Iterative
// A DFS based recursive function that returns true if a
// matching for vertex u is possible
bool bpm(bool bpGraph[M][N], int u, bool seen[], int matchR[])
{
// Try every job one by one
for (int v = 0; v < N; v++)
{
// If applicant u is interested in job v and v is
// not visited
if (bpGraph[u][v] && !seen[v])
{
seen[v] = true; // Mark v as visited
// If job 'v' is not assigned to an applicant OR
// previously assigned applicant for job v (which is matchR[v])
// has an alternate job available.
// Since v is marked as visited in the above line, matchR[v]
// in the following recursive call will not get job 'v' again
if (matchR[v] < 0 || bpm(bpGraph, matchR[v], seen, matchR))
{
matchR[v] = u;
return true;
}
}
}
return false;
}
// Returns maximum number of matching from M to N
int maxBPM(bool bpGraph[M][N])
{
// An array to keep track of the applicants assigned to
// jobs. The value of matchR[i] is the applicant number
// assigned to job i, the value -1 indicates nobody is
// assigned.
int matchR[N];
// Initially all jobs are available
memset(matchR, -1, sizeof(matchR));
int result = 0; // Count of jobs assigned to applicants
for (int u = 0; u < M; u++)
{
// Mark all jobs as not seen for next applicant.
bool seen[N];
memset(seen, 0, sizeof(seen));
// Find if the applicant 'u' can get a job
if (bpm(bpGraph, u, seen, matchR))
result++;
}
return result;
}
Это должен быть простой перевод из рекурсивного DFS в итеративный с использованием стека. – dfb
Это выглядит как обман [Как реализовать глубину первого поиска для графа с нерекурсивным aprroach] (http://stackoverflow.com/q/21508765/572670). Если вы считаете, что это не так, пожалуйста, уточните, почему, или я закрою как обман. – amit
его отличие от способа обработки текущего будет зависеть от выхода остальных рекурсивных вызовов dfs. итеративный алгоритм обрабатывает текущий узел и переходит к следующим итерациям. – funkyme