Submission #25765242


Source Code Expand

class Union_Find():
    __slots__=["n","parents","rank"]
    def __init__(self,N):
        """0,1,...,N-1を要素として初期化する.

        N:要素数
        """
        self.n=N
        self.parents=[-1]*N
        self.rank=[0]*N

    def find(self, x):
        """要素xの属している族を調べる.

        x:要素
        """
        V=[]
        while self.parents[x]>=0:
            V.append(x)
            x=self.parents[x]

        for v in V:
            self.parents[v]=x
        return x

    def union(self, x, y):
        """要素x,yを同一視する.

        x,y:要素
        """
        x=self.find(x)
        y=self.find(y)

        if x==y:
            return

        if self.rank[x]<self.rank[y]:
            x,y=y,x

        self.parents[x]+=self.parents[y]
        self.parents[y]=x

        if self.rank[x]==self.rank[y]:
            self.rank[x]+=1

    def size(self, x):
        """要素xの属している要素の数.

        x:要素
        """
        return -self.parents[self.find(x)]

    def same(self, x, y):
        """要素x,yは同一視されているか?

        x,y:要素
        """
        return self.find(x) == self.find(y)

    def members(self, x):
        """要素xが属している族の要素.
        ※族の要素の個数が欲しいときはsizeを使うこと!!

        x:要素
        """
        root = self.find(x)
        return [i for i in range(self.n) if self.find(i) == root]

    def roots(self):
        """族の名前のリスト
        """
        return [i for i, x in enumerate(self.parents) if x < 0]

    def group_count(self):
        """族の個数
        """
        return len(self.roots())

    def all_group_members(self):
        """全ての族の出力
        """
        X={r:[] for r in self.roots()}
        for k in range(self.n):
            X[self.find(k)].append(k)
        return X

    def refresh(self):
        for i in range(self.n):
            _=self.find(i)

    def __str__(self):
        return '\n'.join('{}: {}'.format(r, self.members(r)) for r in self.roots())

    def __repr__(self):
        return self.__str__()
#==================================================
import sys
input=sys.stdin.readline

N,M=map(int,input().split())
E=[]
for _ in range(M):
    a,b,c=map(int,input().split())
    E.append((a-1,b-1,c))

E.sort(key=lambda e:e[-1])
U=Union_Find(N)

X=0
for a,b,c in E:
    if not U.same(a,b):
        U.union(a,b)
    else:
        X+=max(0,c)

print(X)

Submission Info

Submission Time
Task E - Destruction
User Kazu1998k
Language PyPy3 (7.3.0)
Score 500
Code Size 2625 Byte
Status AC
Exec Time 628 ms
Memory 110216 KiB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 500 / 500
Status
AC × 3
AC × 23
Set Name Test Cases
Sample sample_01.txt, sample_02.txt, sample_03.txt
All hand_01.txt, hand_02.txt, random_01.txt, random_02.txt, random_03.txt, random_04.txt, random_05.txt, random_06.txt, random_07.txt, random_08.txt, random_09.txt, random_10.txt, random_11.txt, random_12.txt, random_13.txt, random_14.txt, random_15.txt, random_16.txt, random_17.txt, random_18.txt, sample_01.txt, sample_02.txt, sample_03.txt
Case Name Status Exec Time Memory
hand_01.txt AC 65 ms 62548 KiB
hand_02.txt AC 52 ms 62492 KiB
random_01.txt AC 537 ms 103856 KiB
random_02.txt AC 174 ms 78660 KiB
random_03.txt AC 470 ms 97584 KiB
random_04.txt AC 170 ms 77976 KiB
random_05.txt AC 240 ms 81336 KiB
random_06.txt AC 363 ms 92448 KiB
random_07.txt AC 547 ms 108752 KiB
random_08.txt AC 570 ms 109764 KiB
random_09.txt AC 477 ms 101692 KiB
random_10.txt AC 495 ms 101000 KiB
random_11.txt AC 482 ms 104664 KiB
random_12.txt AC 440 ms 97528 KiB
random_13.txt AC 628 ms 110216 KiB
random_14.txt AC 520 ms 104944 KiB
random_15.txt AC 433 ms 95068 KiB
random_16.txt AC 385 ms 94424 KiB
random_17.txt AC 511 ms 109336 KiB
random_18.txt AC 508 ms 101012 KiB
sample_01.txt AC 49 ms 62288 KiB
sample_02.txt AC 54 ms 62560 KiB
sample_03.txt AC 57 ms 62460 KiB