69 lines
1.2 KiB
Go
69 lines
1.2 KiB
Go
|
package main
|
||
|
|
||
|
import aq "github.com/emirpasic/gods/v2/queues/arrayqueue"
|
||
|
|
||
|
func buildMatrix(k int, rowConditions [][]int, colConditions [][]int) [][]int {
|
||
|
toposort := func(edges [][]int, n int) []int {
|
||
|
neighbours := make([][]int, n+1)
|
||
|
for i := range n + 1 {
|
||
|
neighbours[i] = []int{}
|
||
|
}
|
||
|
|
||
|
degrees, order := make([]int, n+1), make([]int, n)
|
||
|
for _, edge := range edges {
|
||
|
u, v := edge[0], edge[1]
|
||
|
|
||
|
neighbours[u] = append(neighbours[u], v)
|
||
|
degrees[v]++
|
||
|
}
|
||
|
|
||
|
queue := aq.New[int]()
|
||
|
for i := 1; i <= n; i++ {
|
||
|
if degrees[i] == 0 {
|
||
|
queue.Enqueue(i)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
idx := 0
|
||
|
for !queue.Empty() {
|
||
|
u, _ := queue.Dequeue()
|
||
|
order[idx] = u
|
||
|
|
||
|
n--
|
||
|
for _, v := range neighbours[u] {
|
||
|
degrees[v]--
|
||
|
if degrees[v] == 0 {
|
||
|
queue.Enqueue(v)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
idx++
|
||
|
}
|
||
|
|
||
|
if n != 0 {
|
||
|
return []int{}
|
||
|
}
|
||
|
return order
|
||
|
}
|
||
|
|
||
|
rowOrder, colOrder := toposort(rowConditions, k), toposort(colConditions, k)
|
||
|
if len(rowOrder) == 0 || len(colOrder) == 0 {
|
||
|
return [][]int{}
|
||
|
}
|
||
|
|
||
|
matrix := make([][]int, k)
|
||
|
for i := range k {
|
||
|
matrix[i] = make([]int, k)
|
||
|
}
|
||
|
|
||
|
for row := range k {
|
||
|
for col := range k {
|
||
|
if rowOrder[row] == colOrder[col] {
|
||
|
matrix[row][col] = rowOrder[row]
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return matrix
|
||
|
}
|