package main import . "fmt" const INF int = 1e18+3 func main() { var n,m int Scan(&n,&m) table := make([][]int, n) for i := range table { table[i] = make([]int, n) for j := range table[i] { table[i][j] = INF } table[i][i] = 0 } for i := 0; i < m; i++ { var a, b int Scan(&a,&b) a-- b-- table[a][b] = 1 table[b][a] = 1 } for i := 0; i < n; i++ { for j := 0; j < n; j++ { for k := 0; k < n; k++ { if table[j][k] > table[j][i] + table[i][k] { table[j][k] = table[j][i] + table[i][k] } } } } // println(Sprintf("%#v", table)) ans := 0 for i := 0; i < n; i++ { for j := i+1; j < n; j++ { if table[i][j] == 2 { continue } for k := j+1; k < n; k++ { if table[j][k] == 2 || table[i][k] == 2 { continue } ans++ } } } Println(ans) } /* 考察 問題文がよくわからんが 友達関係でグラフを作ったとき 距離が2以下の関係は「良い関係ではない」 距離が3以上もしくは連結していないのを「良い関係である」 としている感じ? フロイドワーシャルして相互距離求めたあと組み合わせ総当たりでカウントする感じ? 違うっぽい サンプルは距離2の関係だけ除外すると答えが一致するが これは問題解釈と一致しない わけわからん どうも1つ目の ・「良い関係」にある土偶は、友達の友達関係ではない。 だけが良い関係の条件で 2つ目の ・友達の友達には、自分や自分の友達は含まれない。 これは「良い関係」の条件ではなく 「友達の友達」の説明…? XとYが友達の場合、自分Xから見たらYは友達で、友達Yから見たら自分Xは友達で、 自分Xから見た友達Yの友達には自分Xも含まれるので、XとYが友達の場合は上記条件を満たさない(つまりXとYは友達の友達という関係ではない???意味が分からない) 読解力が無さ過ぎて解釈できない… うーん、 XとYが友達で、YとZが友達で、XとZが友達の場合 Xから見た場合、Zは友達Yの友達なので、XとZは友達の友達の関係、のように解釈できるが、上記条件によりXとZは直接の友達でもあるため、XとZは友達の友達という関係にはしない、ということか? ややこしい うーん、なるほど XとYが友達のとき、XにとってX自身も友達の友達と解釈可能になるが、上記条件に従い、友達の友達とは解釈しない、 ってことか…? 要するに、最短距離がちょうど2になる関係ときだけ友達の友達と定義する、ってことを言いたいのか */