prim(从点出发)
不常用?用Dijkstra就可以?
通电
安慰奶牛 用这两种都可以写
之后再看
Dijkstra (权值最小的边)
实用的题与代码才可比较合适一些
1.并查集部分
p=[i for i in range(2022)]
def find(x):
if x!=p[x]:
p[x]=find(p[x])
return p[x]
def union(x,y):
if find(x)!=find(y):
p[find(x)]=find(y)
2.权值与按权排序
def weight(x,y):
a='0'*(4-len(str(x)))+str(x)
b='0'*(4-len(str(y)))+str(y)
s=0
for i in range(4):
if a[i]!=b[i]:
s+=int(a[i])+int(b[i])
return s
edge=[]
for i in range(1,2022):
for j in range(1,2022):
edge.append((i,j,weight(i,j)))
edge.sort(key=lambda x:x[2])
疑问:(1,20)与(20,1)的权值不一样,虽然是一桥的两个方向?
答:任意 到 任意 是双向的
3.判断与计数
count=0
j=1
for i in edge:
try :
if find(i[0])!=find(i[1]) and j<=2020:#若相等,会形成环
count+=i[2]
union(i[0],i[1])
j+=1
except:
print(i[0],i[1])
break
print(count)
总代码
p=[i for i in range(2022)]
def find(x):
if x!=p[x]:
p[x]=find(p[x])
return p[x]
def union(x,y):
if find(x)!=find(y):
p[find(x)]=find(y)
def weight(x,y):
a='0'*(4-len(str(x)))+str(x)
b='0'*(4-len(str(y)))+str(y)
s=0
for i in range(4):
if a[i]!=b[i]:
s+=int(a[i])+int(b[i])
return s
edge=[]
for i in range(1,2022):
for j in range(1,2022):
edge.append((i,j,weight(i,j)))
edge.sort(key=lambda x:x[2])
count=0
j=1
for i in edge:
try :
if find(i[0])!=find(i[1]) and j<=2020:#若相等,会形成环
count+=i[2]
union(i[0],i[1])
j+=1
except:
print(i[0],i[1])
break
print(count)