CSES - Datatähti 2022 alku - Results
Submission details
Task:Tietoverkko
Sender:okkokko
Submission time:2021-10-11 21:36:07 +0300
Language:Python3 (CPython3)
Status:READY
Result:25
Feedback
groupverdictscore
#1ACCEPTED10
#2ACCEPTED15
#30
Test results
testverdicttimegroup
#1ACCEPTED0.03 s1, 2, 3details
#2ACCEPTED0.10 s2, 3details
#3--3details

Code



def GetInput():
    n = int(input())
    out=[(n,)]
    for i in range(n-1):
        a = input()
        out.append(tuple(int(b) for b in a.split()))
    return out
exampleInput="""4
1 2 5
2 3 1
2 4 2
"""
exampleInput="""8
1 3 8
2 1 5
4 2 11
5 2 2
6 5 8
7 4 1
8 5 5
"""
exampleInput=[tuple(int(b) for b in a.split()) for a in exampleInput.splitlines()]
I=exampleInput
I=GetInput()
n=I[0][0]
# yhteys voidaan kuvata virtaavan vain yhteen suuntaan? parin suuremmassa yksilössä on referenssi pienempään, 
# ja kun mennään koneiden listan läpi, mennään pienimmästä suurimpaan.
# voidaan huomata että ei ole mahdollista olla ympyröitä, joten jokaisesta koneesta on vain yksi reitti


import collections
koneet=collections.defaultdict(lambda:{})

for i in range(1,n):
    yhteys = I[i]
    b,a=yhteys[0:2]
    koneet[yhteys[0]][yhteys[1]]=yhteys[2]
    koneet[yhteys[1]][yhteys[0]]=yhteys[2]

total=0

defa = collections.defaultdict(int)
cou = collections.Counter

def Crossroads(kone,source,sourceSpeed):
    # sourceSpeed = koneet[kone][source]
    haarat=[]
    yhteydet=defa.copy()
    yhteydet[sourceSpeed]=1
    
    addTotal=0
    for ko_i,ko_i0 in koneet[kone].items():
        if ko_i == source:
            continue
        c=Crossroads(ko_i,kone,ko_i0)
        for j,multiplier in c.items():
            a=min(j,sourceSpeed)
            yhteydet[a]+=multiplier
            addTotal+=multiplier*j
            
        haarat.append(c)
    # for i in range(len(haarat)):
    #     c=haarat[i]
    #     alahaarat=haarat[0:i]
    #     for j,multiplier in c.items():
    #         addTotal+= sum(sum(l0*min(l,j) for l,l0 in haa.items()) for haa in alahaarat)*multiplier
    yhtyhaara=defa.copy()
    for i in range(len(haarat)):
        h=haarat[i]
        for a in h.keys():
            yhtyhaara[a]+=h[a]
    addTotalHalf=0
    soY= sorted(yhtyhaara.keys())
    # for i in range(len(soY)):
    #     # for j in range(len(soY)):
    #     #     addTotalHalf+=min(soY[j],soY[i])*yhtyhaara[soY[i]]*yhtyhaara[soY[j]]
    #     ta=0
    #     tb=0
    #     for j in range(i):
    #         ta+= soY[j]*yhtyhaara[soY[j]]
    #     for j in range(i,len(soY)):
    #         tb+= yhtyhaara[soY[j]]
    #     addTotalHalf+=ta* yhtyhaara[soY[i]]
    #     addTotalHalf+=tb*soY[i]* yhtyhaara[soY[i]]
    ta=0
    tb=0
    for i in soY:
        tb+= yhtyhaara[i]
    for i in soY:
        ta+= i*yhtyhaara[i]
        tb-= yhtyhaara[i]
        addTotalHalf+=(ta+tb*i)* yhtyhaara[i]

    for j in range(len(haarat)):
        ta=0
        tb=0
        h=haarat[j]
        soH=sorted(h.keys())
        for i in soH:
            tb+= h[i]
        for i in soH:
            ta+= i*h[i]
            tb-= h[i]
            addTotalHalf-=(ta+tb*i)*h[i]
        
    global total
    total+=addTotal+(addTotalHalf//2)
    
    # yhteydet = {siirtonopeus:määrä}
    # addTotal = summaan lisättävä arvo joka tulee haaran välisistä yhteyksistä, + haarasta aiemmat addTotal
    return yhteydet

an = Crossroads(1,0,0)


# print(I)
# print(koneet)
# print(an)

print(total)#-(10**9)

Test details

Test 1

Group: 1, 2, 3

Verdict: ACCEPTED

input
100
1 2 74
1 3 100
2 4 50
3 5 40
...

correct output
88687

user output
88687

Test 2

Group: 2, 3

Verdict: ACCEPTED

input
5000
1 2 613084013
1 3 832364259
2 4 411999902
3 5 989696303
...

correct output
1103702320243776

user output
1103702320243776

Test 3

Group: 3

Verdict:

input
200000
1 2 613084013
1 3 832364259
2 4 411999902
3 5 989696303
...

correct output
1080549209850010931

user output
(empty)