代码参考https://blog.csdn.net/qq_47780707/article/details/122612528

n,p=map(int,input().split())
#链接表的第一个数组不用 因为没有节点0
linkedlist=[[] for _ in range(n+1)] 
for _ in range(p):
    x,y=map(int,input().split())
    linkedlist[x].append(y)
    linkedlist[y].append(x)
#print (linkedlist)
#构造树其中i结点的子结点为root[i]
tree=[[]for _ in range(n+1)] #第一个数组不用

def createTree(root):
    if len(linkedlist[root])!=0:
        tree[root]=linkedlist[root][:]
        for x in linkedlist[root]:
            linkedlist[x].remove(root)
            createTree(x)
createTree(1)

#print(tree)
bestresult=300
#输入当前层结点和当前感染人数,计算从下一层开始的被感染的最少人数并返回人数
def dfs(currentlayer,currentcount): #此函数第一个参数为列表,第二个参数为一个int值
    global tree,bestresult
    nextlayer=[]
    for x in currentlayer:
        nextlayer+=tree[x] #列表相加
    minnum=300
    #到达叶子结点,更新bestresult
    if nextlayer==[]:
        if currentcount<bestresult:
            bestresult=currentcount
        return 0
    #若感染人数大于bestresult则剪枝
    elif currentcount+len(nextlayer)-1<bestresult: 
        for i,x in enumerate(nextlayer):#i表示索引 x表示nextlayer[i]
            del nextlayer[i]
            nextnum=dfs(nextlayer,currentcount+len(nextlayer)-1)
            if minnum>nextnum:
                minnum=nextnum
            nextlayer.insert(i,x)
        return len(nextlayer)-1+minnum
    #若大于则直接返回300,即表示剪枝
    else:
        return 300
    
#最后加的1是加上原本就被感染的根节点
print(dfs([1],1)+1)



点赞(0)
 

0.0分

0 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论