package main import . "fmt" import . "os" import bf "bufio" import . "sort" func main() { rd := bf.NewReader(Stdin) var n,m,k int Fscan(rd,&n,&m,&k) eIn := make([]int, n) eOut := make([]int, n) for i := 0; i < m; i++ { var a, b int Fscan(rd,&a,&b) a-- b-- eIn[b]++ eOut[a]++ } outs := 0 needs := 0 idles := make([]int, 0, n) for i, c := range eOut { if c > 0 { needs += max(0, k - eIn[i]) outs++ } else { idles = append(idles, eIn[i]) } } if outs > k { Println(needs) return } Sort(Reverse(IntSlice(idles))) for _, c := range idles[:(k-outs)+1] { needs += max(0, k-c) } Println(needs) } /* 考察 リジャッジでWAになってたが 提出したソースコードに考察を書きこんでなかったため どういう理屈の解法のか忘却なので 考察しなおし(ていうか、解説も毎度読んでるのに忘却しすぎである) ある頂点から出る辺があれば その頂点に入ってくる辺は K 本以上 N 個の頂点なので 出る辺は最大 N-1 本 入る辺も最大 N-1 本 出る辺を持つ頂点が X 個あったとする X 個それぞれに入る辺 K 本必要である 不足分をどの頂点から仕入れるのか 出る辺がない頂点からも仕入れる必要があるならその頂点も入る辺が K 本必要になる X > K のとき おそらく、X 個の頂点からのみで K 本分を仕入れることが可能なはず X 個に含まれる V0,V1,V2 において V0 は入る辺が K 本未満として V1 から V0 に初期辺がある場合、仕入れ済み V2 から V0 に初期辺がない場合、仕入れ可能 入る初期辺が Y0 本 ( Y0 < K ) のとき、必要な入る辺は Z0 本 ( Z0 = K - Y0 ) Y0 本のうち X 個に含まれる頂点からの初期辺が W0 本 ( W0 <= Y0 ) X 個に含まれる頂点からの初期辺のない頂点が E0 個 ( E0 = X - W0 ) つまり E0 >= Z0 となっているかどうか つまり E0 - Z0 >= 0 になっているかどうか E0 - Z0 = (X - W0) - (K - Y0) = (X - K) + (Y0 - W0) > 0 つまり、可能 不足分を数えればいいだけ X = K+1 個のとき X 個で完全グラフを作るようなものである X <= K のとき 不足分を出る辺のない頂点から仕入れる必要がある 仕入れ先の頂点にも入る辺が K 本必要になる 仕入れ先の頂点の入る辺の不足分がなるべく少ない頂点から仕入れることで追加する辺を最小化できる(貪欲法か?) つまり、入る辺の多い頂点を選び追加して、追加する頂点の数を P 個とするなら X + P > K となるよう最小の P 個を加える必要がある すなわち X + P = K + 1 を満たすよう P = (K - X) + 1 個の頂点を新規追加する こうしてきちんと考察すると リジャッジで落ちてWAになったコードは 入る辺が K 本以上ある頂点について考慮してないことがわかった K 本存在しないこと決めつけてる感じでダメ */