目录
1.题目详情 - 1034 Head of a Gang (30 分) (pintia.cn)
2.题目详情 - 1076 Forwards on Weibo (30 分) (pintia.cn)
4.题目详情 - 1003 Emergency (25 分) (pintia.cn)
1.题目详情 - 1034 Head of a Gang (30 分) (pintia.cn)
adj=[[0 for i in range(26)]for j in range(26)]
weight=[0 for i in range(26)]
vis=[False for i in range(26)]
stringtoint={}
inttostring={}
gang={}
person=0
def change(string):
global person
if string not in stringtoint:
num=person
person+=1
else:
num=stringtoint[string]
stringtoint[string]=num
inttostring[num]=string
return num
def main():
def dfstravel():
def dfs(curindex):
nonlocal head, curnum, curvalue
curnum += 1
vis[curindex] = True
if weight[curindex] > weight[head]:
head = curindex
for i in range(person):
if adj[curindex][i] != 0:
curvalue += adj[curindex][i]
adj[curindex][i] = 0
adj[i][curindex] = 0
if not vis[i]:
dfs(i)
return
global person
nonlocal b
for i in range(person):
if not vis[i]:
head, curnum, curvalue = i, 0, 0
dfs(i)
if curnum > 2 and curvalue > b:
gang[head] = curnum
return
a,b=map(int,input().split())
for i in range(a):
x,y,z=input().split()
z=int(z)
x=change(x)
y=change(y)
adj[x][y]+=z
adj[y][x]+=z
weight[x]+=z
weight[y]+=z
dfstravel()
print(len(gang))
for i,j in gang.items():
print(inttostring[i],j)
main()
2.题目详情 - 1076 Forwards on Weibo (30 分) (pintia.cn)
adj=[[]for i in range(101)]
vis=[False for i in range(101)]
a,b=map(int,input().split())
for i in range(1,a+1):
u=list(map(int,input().split()))
for j in range(1,len(u)):
adj[u[j]].append(i)
check=list(map(int,input().split()))
def bfs(index):
from collections import deque
q=deque([index])
vis[index]=True
level=0
ans=0
global b
while q and level<b:
size=len(q)
for x in range(size):
top=q.popleft()
level+=1
for i in adj[top]:
if not vis[i]:
ans+=1
q.append(i)
vis[i]=True
return ans
def init():
global vis
vis=[False for i in range(101)]
for i in check[1:]:
init()
print(bfs(i))
3.dijkstra
v,l,s=map(int,input().split())
adj=[[]for i in range(v)]
for i in range(l):
x,y,z=map(int,input().split())
adj[x].append((y,z))
vis=[False for i in range(v)]
d=[1<<31 for i in range(v)]
def dijkstra(adj,d,s):
d[s]=0
for x in range(v):
minindex=-1
minlength=1<<31
for i in range(v):
if not vis[i] and d[i]<minlength:
minindex=i
minlength=d[i]
if minindex==-1:
return
vis[minindex]=True
for i in adj[minindex]:
des=i[0]
length=i[1]
if not vis[des] and d[minindex]+length<d[des]:
d[des]=d[minindex]+length
return
dijkstra(adj,d,s)
print(d)
# 6 8 0
# 0 1 1
# 0 3 4
# 0 4 4
# 1 3 2
# 2 5 1
# 3 2 2
# 3 4 3
# 4 5 3
4.题目详情 - 1003 Emergency (25 分) (pintia.cn)
(1)dijkstra解法
n,m,s,e=map(int,input().split())
adj=[[]for i in range(n)]
d=[1<<31 for i in range(n)]
vis=[False for i in range(n)]
weight=list(map(int,input().split()))
w=[0 for i in range(n)]
nums=[0 for i in range(n)]
for i in range(m):
a,b,c=map(int,input().split())
adj[a].append((b,c))
adj[b].append((a,c))
def dijkstra(adj,d,s):
d[s]=0
nums[s]=1
w[s]=weight[s]
for x in range(n):
minindex = -1
minlength = 1 << 31
for i in range(n):
if not vis[i] and d[i]<minlength:
minlength=d[i]
minindex=i
if minindex==-1:
return
vis[minindex]=True
for i in adj[minindex]:
index=i[0]
long=i[1]
if not vis[index]:
if d[minindex]+long<d[index]:
d[index]=d[minindex]+long
nums[index]=nums[minindex]
w[index]=w[minindex]+weight[index]
elif d[minindex]+long==d[index]:
nums[index]+=nums[minindex]
if w[index]<w[minindex]+weight[index]:
w[index]=w[minindex]+weight[index]
return
dijkstra(adj,d,s)
print(nums[e],w[e])
(2)dijkstra+dfs
n,m,s,e=map(int,input().split())
adj=[[]for i in range(n)]
d=[1<<31 for i in range(n)]
vis=[False for i in range(n)]
weight=list(map(int,input().split()))
w=[weight[i] for i in range(n)]
nums=[0 for i in range(n)]
pre=[[]for i in range(n)]
for i in range(m):
a,b,c=map(int,input().split())
adj[a].append((b,c))
adj[b].append((a,c))
def dijkstra(adj,d,s):
d[s]=0
nums[s]=1
w[s]=weight[s]
for x in range(n):
minindex = -1
minlength = 1 << 31
for i in range(n):
if not vis[i] and d[i]<minlength:
minlength=d[i]
minindex=i
if minindex==-1:
return
vis[minindex]=True
for i in adj[minindex]:
index=i[0]
long=i[1]
if not vis[index]:
if d[minindex]+long<d[index]:
d[index]=d[minindex]+long
pre[index].clear()
pre[index].append(minindex)
elif d[minindex]+long==d[index]:
pre[index].append(minindex)
return
ans=0
answeight=-1
def dfs(s,v,path):
if v==s:
global ans,answeight
ans+=1
weights=0
path.append(v)
for i in path:
weights+=weight[i]
if weights>answeight:
answeight=weights
return
for i in pre[v]:
dfs(s,i,path+[v])
dijkstra(adj,d,s)
dfs(s,e,[])
print(ans,answeight)
(3)bellman算法
注意前驱
n,m,s,e=map(int,input().split())
adj=[[]for i in range(n)]
d=[1<<31 for i in range(n)]
vis=[False for i in range(n)]
weight=list(map(int,input().split()))
w=[0 for i in range(n)]
nums=[0 for i in range(n)]
pre=[set() for i in range(n)]
for i in range(m):
a,b,c=map(int,input().split())
adj[a].append((b,c))
adj[b].append((a,c))
def bellman(s):
d[s]=0
w[s]=weight[s]
nums[s]=1
for i in range(n-1):
for u in range(n):
for v in adj[u]:
index=v[0]
length=v[1]
if d[u]+length<d[index]:
d[index]=d[u]+length
w[index]=w[u]+weight[index]
nums[index]=nums[u]
pre[index].clear()
pre[index].add(u)
elif d[u]+length==d[index]:
if w[index]<w[u]+weight[index]:
w[index]=w[u]+weight[index]
pre[index].add(u)
nums[index]=0
if index==e:
print(pre[index])
for i in pre[index]:
nums[index]+=nums[i]
bellman(s)
print(nums[e],w[e])
5.SPFA
inq=[False for i in range(n)]
def spfa(s):
d[s]=0
from collections import deque
q=deque([s])
inq[s]=True
nums[s]+=1
while q:
top=q.popleft()
inq[top]=False
for i in adj[top]:
index=i[0]
length=i[1]
if d[top]+length<d[index]:
d[index]=d[top]+length
if not inq[index]:
q.push(index)
inq[index]=True
nums[index]+=1
if nums[index]>=n:
return False
return True