代码参考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 人评分
2005年春浙江省计算机等级考试二级C 编程题(1) (C语言代码)浏览:644 |
简单编码 (C++代码)(这里推荐用switch)浏览:999 |
C语言训练-排序问题<2> (C++代码)(sort函数)浏览:1722 |
C语言程序设计教程(第三版)课后习题9.6 (C语言代码)浏览:596 |
C语言程序设计教程(第三版)课后习题6.4 (C语言代码)浏览:623 |
C语言程序设计教程(第三版)课后习题10.2 (C语言代码)浏览:564 |
1124题解浏览:630 |
杨辉三角 (C语言代码)浏览:505 |
C二级辅导-统计字符 (C语言代码)浏览:514 |
敲七 (C++代码)浏览:1119 |