Es gibt eine quadratische binäre Matrix, die die Verbindungen in einem zweiseitigen Graphen bezeichnet. Die Frage ist: Gibt es eine Eins-zu-Eins-Zuordnung aller Zeilen zu den Spalten? (Falls ich mich falsch ausdrücke: ein vollständig verbundener Graph erfüllt diese Anforderung, da wir nicht auf eine Eins-zu-Eins-Abbildung beschränkt sind).
Ich habe das Folgende geschrieben. Gibt es eine lächerlich schnellere Möglichkeit, dies zu erreichen?
/* Is there a one-to-one mapping possible with the given bipartite graph?
input: graph[a][b] = connected (1) or not (0)
return: 0=no 1=yes */
int one_to_one(int graph[SIZE][SIZE], int rows_checked /* =0 */, int col_chosen /* =0 */)
{
int my_graph[SIZE][SIZE], i, j, retval;
memcpy(my_graph, graph, sizeof(graph[0][0]) * SIZE * SIZE);
if (rows_checked > 0)
for (i=rows_checked; i<SIZE; i++)
my_graph[i][col_chosen] = -1; /* flag for "this column done" */
retval=1;
for (i=0; i<SIZE; i++) {
if (my_graph[rows_checked][i] == -1)
continue;
retval=0;
if (my_graph[rows_checked][i] == 1)
if (one_to_one(my_graph, rows_checked+1, i))
return 1;
}
return retval;
}