2 部グラフの接続を表す正方バイナリ マトリックスがあります。問題は、すべての行から列への 1 対 1 のマッピングが存在するかどうかです。(明確にするために、言語を間違って使用している場合、完全に接続されたグラフは、1 対 1 のマッピングのみに制限されていないため、この要件を満たします)。
以下を書きました。これを達成するためのとてつもなく速い方法はありますか?
/* 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;
}