Submission #3044030


Source Code Expand

import math,string,itertools,fractions,heapq,collections,re,array,bisect,sys,random,time,copy,functools

sys.setrecursionlimit(10**7)
inf = 10**20
eps = 1.0 / 10**10
mod = 10**9+7
dd = [(-1,0),(0,1),(1,0),(0,-1)]
ddn = [(-1,0),(-1,1),(0,1),(1,1),(1,0),(1,-1),(0,-1),(-1,-1)]

def LI(): return [int(x) for x in sys.stdin.readline().split()]
def LI_(): return [int(x)-1 for x in sys.stdin.readline().split()]
def LF(): return [float(x) for x in sys.stdin.readline().split()]
def LS(): return sys.stdin.readline().split()
def I(): return int(sys.stdin.readline())
def F(): return float(sys.stdin.readline())
def S(): return input()
def pf(s): return print(s, flush=True)


def main():
    n,m = LI()
    s,t = LI()
    e = collections.defaultdict(list)
    for _ in range(m):
        u,v,d = LI()
        e[u].append((v,d))
        e[v].append((u,d))

    def search(s,t):
        d = collections.defaultdict(lambda: [inf, 0])
        d[s] = [0, 1]
        q = []
        heapq.heappush(q, (0, s))
        v = collections.defaultdict(bool)
        while len(q):
            k, u = heapq.heappop(q)
            if v[u]:
                continue
            v[u] = True

            if u == t:
                return d

            uc = d[u][1]

            for uv, ud in e[u]:
                if v[uv]:
                    continue
                vd = k + ud
                if d[uv][0] < vd:
                    continue
                if d[uv][0] > vd:
                    d[uv] = [vd, uc]
                    heapq.heappush(q, (vd, uv))
                elif d[uv][0] == vd:
                    d[uv][1] += uc

        return d

    d1 = search(s,t)
    d2 = search(t,s)
    rd = d1[t][0]
    kk = rd / 2.0

    r = d1[t][1] ** 2 % mod
    for k in list(d1.keys()):
        t,c = d1[k]
        if t > kk:
            continue
        if t == kk:
            if d2[k][0] == t:
                r -= (c**2 * d2[k][1]**2) % mod
            continue

        for uv, ud in e[k]:
            if d2[uv][0] >= kk or t + ud + d2[uv][0] != rd:
                continue
            r -= (c**2 * d2[uv][1]**2) % mod

    return r % mod




print(main())

Submission Info

Submission Time
Task E - Avoiding Collision
User iehn
Language Python (3.4.3)
Score 0
Code Size 2227 Byte
Status TLE
Exec Time 2111 ms
Memory 131484 KB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 0 / 700
Status
AC × 4
AC × 8
TLE × 14
Set Name Test Cases
Sample sample01.txt, sample02.txt, sample03.txt, sample04.txt
All 01.txt, 02.txt, 03.txt, 04.txt, 05.txt, 06.txt, 07.txt, 08.txt, 09.txt, 10.txt, 11.txt, 12.txt, 13.txt, 14.txt, 15.txt, 16.txt, 17.txt, 18.txt, sample01.txt, sample02.txt, sample03.txt, sample04.txt
Case Name Status Exec Time Memory
01.txt AC 1799 ms 106684 KB
02.txt AC 1288 ms 90672 KB
03.txt TLE 2111 ms 126712 KB
04.txt TLE 2111 ms 131484 KB
05.txt TLE 2110 ms 124604 KB
06.txt AC 1943 ms 114736 KB
07.txt TLE 2111 ms 127888 KB
08.txt AC 1257 ms 98576 KB
09.txt TLE 2111 ms 128064 KB
10.txt TLE 2110 ms 127612 KB
11.txt TLE 2110 ms 110016 KB
12.txt TLE 2110 ms 116440 KB
13.txt TLE 2110 ms 121616 KB
14.txt TLE 2110 ms 127324 KB
15.txt TLE 2111 ms 124044 KB
16.txt TLE 2110 ms 124272 KB
17.txt TLE 2110 ms 123744 KB
18.txt TLE 2111 ms 125204 KB
sample01.txt AC 42 ms 5460 KB
sample02.txt AC 42 ms 5460 KB
sample03.txt AC 42 ms 5460 KB
sample04.txt AC 42 ms 5464 KB