こんにちは、ナナオです。

前回に引き続き競プロを実施していきたいと思います。

今回の問題は以下です。

一方通行(グラフ上の移動) | レベルアップ問題集 | プログラミング学習サイト【paizaラーニング】

実装

まずは以下のように実装しました。

package main
import "fmt"
func main(){
    var n int
    fmt.Scan(&n)
    g := make([][]int, n)
    for i := 0; i < n; i++ {
        g[i] = make([]int, n)
    }
    for i := 1; i < n; i++ {
        var a, b int
        fmt.Scan(&a, &b)
        g[a - 1][b - 1] = i
        g[b - 1][a - 1] = i
    }
    fmt.Println(1)
    for i := 0; i < n; i++ {
        for j := 0; j < n; j++ {
            if g[i][j] == i + 1 {
                fmt.Println(j + 1)
                break
            }
        }
    }
}

ですがこれだと入力例1は解けてもそれ以外が解けません。

ということで少し改修しました。

package main
import "fmt"
func main(){
    var n int
    fmt.Scan(&n)
    g := make([][]int, n)
    for i := 0; i < n; i++ {
        g[i] = make([]int, n)
    }
    for i := 1; i < n; i++ {
        var a, b int
        fmt.Scan(&a, &b)
        g[a - 1][b - 1] = i
        g[b - 1][a - 1] = i
    }
    fmt.Println(1)
    i := 0
    cnt := 1
    for {
        for j := 0; j < n; j++ {
            if g[i][j] == cnt {
                fmt.Println(j + 1)
                i = j
                cnt++
                break
            }
        }
        if cnt == n {
            break
        }
    }
}

問題は解けるようになったはずですが、タイムオーバーになってしまいました。

回答を見つつ修正しました。

package main
import "fmt"
func main(){
    var n int
    fmt.Scan(&n)
    g := make([][]int, n)
    for i := 0; i < n; i++ {
        g[i] = make([]int, n)
    }
    for i := 1; i < n; i++ {
        var a, b int
        fmt.Scan(&a, &b)
        g[a - 1][b - 1] = 1
        g[b - 1][a - 1] = 1
    }
    i := 0
    for _i := 0; _i < n; _i++ {
        fmt.Println(i + 1)
        for j := 0; j < n; j++ {
            if g[i][j] == 1 {
                g[j][i] = 0
                i = j
                break
            }
        }
    }
}

これで通るようになりました。

普通に配列には1入れるだけでよかったんですね。。

というわけで今回はこれで👍