cp_truc_tiep = {
'a': {'c': 0.2, 'b': 0.1},
'b': {'c': 0.3, 'd': 0.4},
'c': {'e': 0.5},
'd': {'e': 0.6},
}
'''
a -> c, b
b -> c, d
c -> e
d -> e
a -> e ?
'''
# lay het cac cty trong list
list_cty = set(cp_truc_tiep.keys())
for cty, l in cp_truc_tiep.items():
list_cty = list_cty.union(set(l.keys()))
cp_all = { }
def sum_so_huu(link_cty):
result = 1
for i in range(len(link_cty) - 1):
from_cty = link_cty[i]
to_cty = link_cty[i + 1]
result *= cp_truc_tiep[from_cty][to_cty]
return result
def tinh_cp(current_cty, init_cty, end_cty, link_cty):
if current_cty == end_cty:
sum_link = sum_so_huu(link_cty)
# print(link_cty)
# print('So huu = {}'.format(sum_link))
if init_cty not in cp_all:
cp_all[init_cty] = {}
if end_cty not in cp_all[init_cty]:
cp_all[init_cty][end_cty] = 0
cp_all[init_cty][end_cty] += sum_link
return
if current_cty not in cp_truc_tiep:
return
for cty in cp_truc_tiep[current_cty]:
tinh_cp(cty, init_cty, end_cty, link_cty + [cty])
def list_cp(cty):
cty1 = cty
for cty2 in list_cty:
if cty1 != cty2:
tinh_cp(cty1, cty1, cty2, [cty1])
val = cp_all.get(cty1, {}).get(cty2, 0)
if val != 0:
print('{} so huu {}: {}'.format(cty1, cty2, val))
list_cp('a')
CmNwX3RydWNfdGllcCA9IHsKICAgICdhJzogeydjJzogMC4yLCAnYic6IDAuMX0sCiAgICAnYic6IHsnYyc6IDAuMywgJ2QnOiAwLjR9LAogICAgJ2MnOiB7J2UnOiAwLjV9LAogICAgJ2QnOiB7J2UnOiAwLjZ9LAp9CgonJycKYSAtPiBjLCBiCmIgLT4gYywgZApjIC0+IGUKZCAtPiBlIAoKYSAtPiBlID8KCicnJwoKIyBsYXkgaGV0IGNhYyBjdHkgdHJvbmcgbGlzdApsaXN0X2N0eSA9IHNldChjcF90cnVjX3RpZXAua2V5cygpKQpmb3IgY3R5LCBsIGluIGNwX3RydWNfdGllcC5pdGVtcygpOgogICAgbGlzdF9jdHkgPSBsaXN0X2N0eS51bmlvbihzZXQobC5rZXlzKCkpKQoKY3BfYWxsID0geyB9CgpkZWYgc3VtX3NvX2h1dShsaW5rX2N0eSk6CiAgICByZXN1bHQgPSAxCiAgICBmb3IgaSBpbiByYW5nZShsZW4obGlua19jdHkpIC0gMSk6CiAgICAgICAgZnJvbV9jdHkgPSBsaW5rX2N0eVtpXQogICAgICAgIHRvX2N0eSA9IGxpbmtfY3R5W2kgKyAxXQogICAgICAgIHJlc3VsdCAqPSBjcF90cnVjX3RpZXBbZnJvbV9jdHldW3RvX2N0eV0KICAgIHJldHVybiByZXN1bHQKCgpkZWYgdGluaF9jcChjdXJyZW50X2N0eSwgaW5pdF9jdHksIGVuZF9jdHksIGxpbmtfY3R5KToKICAgIGlmIGN1cnJlbnRfY3R5ID09IGVuZF9jdHk6CiAgICAgICAgc3VtX2xpbmsgPSBzdW1fc29faHV1KGxpbmtfY3R5KQogICAgICAgICMgcHJpbnQobGlua19jdHkpCiAgICAgICAgIyBwcmludCgnU28gaHV1ID0ge30nLmZvcm1hdChzdW1fbGluaykpCiAgICAgICAgaWYgaW5pdF9jdHkgbm90IGluIGNwX2FsbDoKICAgICAgICAgICAgY3BfYWxsW2luaXRfY3R5XSA9IHt9CiAgICAgICAgaWYgZW5kX2N0eSBub3QgaW4gY3BfYWxsW2luaXRfY3R5XToKICAgICAgICAgICAgY3BfYWxsW2luaXRfY3R5XVtlbmRfY3R5XSA9IDAKICAgICAgICBjcF9hbGxbaW5pdF9jdHldW2VuZF9jdHldICs9IHN1bV9saW5rCiAgICAgICAgcmV0dXJuCiAgICBpZiBjdXJyZW50X2N0eSBub3QgaW4gY3BfdHJ1Y190aWVwOgogICAgICAgIHJldHVybgogICAgZm9yIGN0eSBpbiBjcF90cnVjX3RpZXBbY3VycmVudF9jdHldOgogICAgICAgIHRpbmhfY3AoY3R5LCBpbml0X2N0eSwgZW5kX2N0eSwgbGlua19jdHkgKyBbY3R5XSkKCgpkZWYgbGlzdF9jcChjdHkpOgogICAgY3R5MSA9IGN0eQogICAgZm9yIGN0eTIgaW4gbGlzdF9jdHk6CiAgICAgICAgaWYgY3R5MSAhPSBjdHkyOgogICAgICAgICAgICB0aW5oX2NwKGN0eTEsIGN0eTEsIGN0eTIsIFtjdHkxXSkKICAgICAgICAgICAgdmFsID0gY3BfYWxsLmdldChjdHkxLCB7fSkuZ2V0KGN0eTIsIDApCiAgICAgICAgICAgIGlmIHZhbCAhPSAwOgogICAgICAgICAgICAgICAgcHJpbnQoJ3t9IHNvIGh1dSB7fToge30nLmZvcm1hdChjdHkxLCBjdHkyLCB2YWwpKQoKCmxpc3RfY3AoJ2EnKQ==