結果
| 問題 | No.1344 Typical Shortest Path Sum |
| コンテスト | |
| ユーザー |
ID 21712
|
| 提出日時 | 2026-05-27 19:28:14 |
| 言語 | Go (1.26.1) |
| 結果 |
AC
|
| 実行時間 | 16 ms / 2,000 ms |
| コード長 | 4,331 bytes |
| 記録 | |
| コンパイル時間 | 10,828 ms |
| コンパイル使用メモリ | 282,004 KB |
| 実行使用メモリ | 6,400 KB |
| 最終ジャッジ日時 | 2026-05-27 19:28:35 |
| 合計ジャッジ時間 | 13,263 ms |
|
ジャッジサーバーID (参考情報) |
judge2_1 / judge3_1 |
| 純コード判定待ち |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 77 |
ソースコード
package main
import . "fmt"
import "container/heap"
type E struct {
s,t,d int
}
func main() {
var n,m int
Scan(&n,&m)
edges := make([]*E, m)
for i := range edges {
e := new(E)
Scan(&e.s, &e.t, &e.d)
e.s--
e.t--
edges[i] = e
}
for _, ans := range solve(n,m, edges) {
Println(ans)
}
}
func solve(n, m int, edges []*E) []int {
paths, _ := JohnsonsAlgorithm(n, edges)
ans := make([]int, n)
for i, ps := range paths {
sum := 0
for _, p := range ps {
if p.dist != INF {
sum += p.dist
}
}
ans[i] = sum
}
return ans
}
const INF int = 1e18+1
type P struct {
dist int
from *E
}
func BellmanFordAlgorithm(vertexCount, startVertexId int, edges []*E) ([]*P,bool) {
ps := make([]*P, vertexCount)
for i := range ps {
ps[i] = new(P)
if i != startVertexId {
ps[i].dist = INF
}
}
for i := 0; i < vertexCount; i++ {
for _, e := range edges {
s := ps[e.s]
t := ps[e.t]
if t.dist > s.dist + e.d {
t.dist = s.dist + e.d
t.from = e
}
}
}
for _, e := range edges {
if ps[e.t].dist > ps[e.s].dist + e.d {
return nil, false
}
}
return ps, true
}
func JohnsonsAlgorithm(vertexCount int, edges []*E) ([][]*P, bool) {
qVertexId := vertexCount
qEdges := make([]*E, len(edges)+vertexCount)
copy(qEdges[:len(edges)], edges)
for i := 0; i < vertexCount; i++ {
e := new(E)
e.s = qVertexId
e.t = i
e.d = 0
qEdges[i+len(edges)] = e
}
qPaths, ok := BellmanFordAlgorithm(vertexCount+1, qVertexId, qEdges)
if !ok {
return nil, false
}
dEdges := make([][]*E, vertexCount)
for i, e := range edges {
ne := new(E)
ne.s = i
ne.t = e.t
ne.d = e.d + qPaths[e.s].dist - qPaths[e.t].dist
dEdges[e.s] = append(dEdges[e.s], ne)
}
pps := make([][]*P, vertexCount)
items := make([]*Item, vertexCount)
for i := range items {
items[i] = newItem(i)
}
for id := 0; id < vertexCount; id++ {
ps := make([]*P, vertexCount)
pps[id] = ps
dists := make([]int, vertexCount)
for i := range ps {
ps[i] = new(P)
if i != id {
ps[i].dist = INF
dists[i] = INF
}
}
pq := newPQ(vertexCount, func(a, b any) bool {
return dists[a.(int)] < dists[b.(int)]
})
heap.Push(pq, items[id])
for pq.Len() > 0 {
curId := heap.Pop(pq).(*Item).value.(int)
for _, e := range dEdges[curId] {
d := dists[curId] + e.d
if dists[e.t] <= d {
continue
}
dists[e.t] = d
ps[e.t].dist = ps[curId].dist + edges[e.s].d
ps[e.t].from = edges[e.s]
if items[e.t].index < 0 {
heap.Push(pq, items[e.t])
} else {
heap.Fix(pq, items[e.t].index)
}
}
}
}
return pps,true
}
func DijkstrasAlgorightm(vertexCount, startVertexId int, edges []*E) []*P {
dEdges := make([][]*E, vertexCount)
for _, e := range edges {
dEdges[e.s] = append(dEdges[e.s], e)
}
ps := make([]*P, vertexCount)
for i := range ps {
ps[i] = new(P)
if i != startVertexId {
ps[i].dist = INF
}
}
pq := newPQ(vertexCount, func(a, b any) bool {
return ps[a.(int)].dist < ps[b.(int)].dist
})
items := make([]*Item, vertexCount)
for i := range items {
items[i] = newItem(i)
}
heap.Push(pq, items[startVertexId])
for pq.Len() > 0 {
id := pq.Pop().(*Item).value.(int)
for _, e := range dEdges[id] {
d := ps[id].dist + e.d
if ps[e.t].dist <= d {
continue
}
ps[e.t].dist = d
ps[e.t].from = e
if items[e.t].index < 0 {
heap.Push(pq, items[e.t])
} else {
heap.Fix(pq, items[e.t].index)
}
}
}
return ps
}
type Item struct {
value any
index int
}
func newItem(value any) *Item {
return &Item{ value: value, index: -1 }
}
type PQ struct {
less func(a, b any) bool
items []*Item
}
func newPQ(initialCapacity int, less func(a, b any) bool) *PQ {
return &PQ{
less: less,
items: make([]*Item, 0, initialCapacity),
}
}
func (pq PQ) Len() int { return len(pq.items) }
func (pq PQ) Swap(i, j int) {
pq.items[i], pq.items[j] = pq.items[j], pq.items[i]
pq.items[i].index = i
pq.items[j].index = j
}
func (pq PQ) Less(i, j int) bool { return pq.less(pq.items[i].value, pq.items[j].value) }
func (pq *PQ) Push(v any) {
item := v.(*Item)
n := len(pq.items)
item.index = n
pq.items = append(pq.items, item)
}
func (pq *PQ) Pop() any {
old := pq.items
n := len(old)
item := old[n-1]
item.index = -1
old[n-1] = nil
pq.items = old[:n-1]
return item
}
ID 21712