0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ABC373Dを解いた

Last updated at Posted at 2024-11-23

以前ABCで解けなかった以下の問題を解いていく

実装コード

まず適当な値を最初のノードに入れ
そこから深さ優先探索をして、エッジの重みから
次のノードの値を計算する。

どうやら入力で与えられる
u→vの重みがwのエッジの他に
v→uで重みが-wのエッジを追加しても良いらしい

import sys
from collections import deque,defaultdict
def rI(): return int(sys.stdin.readline().rstrip())
def rLI(): return list(map(int,sys.stdin.readline().rstrip().split()))
def rI1(): return (int(sys.stdin.readline().rstrip())-1)
def rLI1(): return list(map(lambda a:int(a)-1,sys.stdin.readline().rstrip().split()))
def rS(): return sys.stdin.readline().rstrip()
def rLS(): return list(sys.stdin.readline().rstrip().split())
def err(*args): print(*args, file=sys.stderr)

class Node:
    def __init__(self, val):
        self.val = val
        self.links = []

class Edge:
    def __init__(self, src, dest, wt):
        self.src = src
        self.dest = dest
        self.wt = wt

class Graph:
    def __init__(self, directed=False):
        self.nodes = {}
        self.directed = directed

    def __getitem__(self, k):
        return self.nodes[k]
    
    def __len__(self):
        return len(self.nodes)
    
    def add_node(self, val):
        node = Node(val)
        self.nodes[val] = node
    
    def add_edge(self, src, dest, wt):
        edge = Edge(src, dest, wt)
        if src not in self.nodes:
            self.add_node(src)
        if dest not in self.nodes:
            self.add_node(dest)
        self.nodes[src].links.append(edge)
        if not self.directed:
            reverse_edge = Edge(dest, src, -wt)
            self.nodes[dest].links.append(reverse_edge)
               
def main():
    N, M = rLI()
    G = Graph()

    for i in range(N):
        G.add_node(i+1)
    for _ in range(M):
        u, v, w = rLI()
        G.add_edge(u,v,w)    
    visited = set()
    result = defaultdict(lambda:None)
    # result[1] = {3:3,4:5,5:200401298}.get(len(G),0)

    for k in range(1,N+1):
        if k in visited: continue
        st = deque([G.nodes[k]])
        while st:
            node = st.pop()
            i = node.val
            visited.add(i)
            if result[i] is None:
                result[i] = 0
                # result[i] = (x:={4:6,5:278499365}.get(len(G),0))
                # err(i,x)
            for edge in node.links:
                d = G[edge.dest]
                if (j:=d.val) not in visited:
                    visited.add(j)
                    st.append(d)
                    if result[j] is None:
                        w = edge.wt + result[i]
                        result[j] = w
                        # err(j, w, edge.wt, result[i])
    
    ans = [result[i+1] for i in range(N)]
    print(*ans)
    
if __name__ == '__main__':
    main()

まとめ

ABC373Dを解いた、実装には深さ優先探索を使用した

感想

グラフの拒絶反応を克服するために問題を解いた、
なかなか難しいが、鉄則本を読みながらコーディングして、
グラフについて少し理解を進められた。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?