暴力大法好。
#-*- coding=utf-8 -*-
import xlrd
import copy
import pandas as pd
#导入xls
data=xlrd.open_workbook("C:/Users/hasee/Desktop/visualableWea.vscode/excel_out2.xls")
table = data.sheets()[0] #获得表格
#nrows = table.nrows #行数
#ncols = table.ncols #列数
pointNumSum=50
#数据录入到listx,这里针对该xls文件直接指定了数值。
listx=[]
for i in range(2,52):
list1=[]
for j in range(2,53):
list1.append(table.cell(i,j).value)
listx.append(list1)
def baoli(listx):
answer=[]
connected=[0 for x in range(pointNumSum)]
for x in range(pointNumSum):#处理数值
listx[x][pointNumSum]+=1
for x in range(pointNumSum):
if (listx[x][pointNumSum]==1): #找到孤立点
answer.append(x+1)
connected[x]=1
listx[x][pointNumSum]-=1
for x in range(pointNumSum):
max,flag=1,0
for y in range(pointNumSum):
if listx[y][pointNumSum]>max and y+1 not in answer: #找出当前能覆盖最多非被覆盖的点的非支配集内的点
max=listx[y][pointNumSum]
flag=y
if max>1 : #如果还找的出未入支配集的且与最多未被覆盖点相连的点
answer.append(flag+1)
connected[flag]=1
listx[flag][pointNumSum]-=max
for z in range(pointNumSum):
if listx[flag][z]==1: #如果有与要加入支配集的点相连的点
connected[z]=1 #相连点置1
listx[z][pointNumSum]-=2
for m in range(pointNumSum):
if listx[z][m]==1:
listx[m][pointNumSum]-=1
for x in range(pointNumSum):
if (listx[x][pointNumSum]==1 and connected[x]==0): #找到孤立点
answer.append(x+1)
connected[x]=1
#print(connected)
return answer
print(baoli(copy.deepcopy(listx)))
#步骤如下
#1.随机指定根节点(这里是点0),并求出该节点为根节点生成的DFS树,返回的列表包含了50个点,就是深度优先遍历的顺序。
#2.反向贪心求支配集.按照深度优先遍历的反向顺序检查每个点,如果当前点不属于支配集也不与支配集的点相连,
# 且它的父节点不属于支配集,将其父节点加入到支配集,支配集中点的个数加 1, 标记当前节点,
# 当前节点的父节点, 当前节点的父节点的父节点,因为这些节点要么属于支配集(当前点的父节点),
# 要么与支配集中的点相连(当前节点 和 当前节点的父节点的父节点).
#变量定义
'''
for x in range(pointNumSum): #每个点都作为起始点试一次
for y in range(pointNumSum)
max,flag=0,0
if connected[y]==0 and listx[y][pointNumSum]>=max:
max=listx[y][pointNumSum]
flag=y
if max>0: #如果还找的出未入集的非孤立点
answer.append()
connected[flag]=1 #本身置1
for z in range(50):
if listx[flag][z]==1:
connected[z]=1 #相连点置1
'''
#Teil1 返回DFS序列
startPoint=0 #DFS起始点
'''
def dfsx(listRow,pointNumSum,startPoint):
ordn,used=[-1 for x in range(pointNumSum)],[-1 for x in range(pointNumSum)]#初始化 #ordn[i]=j 编号J的城市在DFS中排第I位
par=[-1 for x in range(pointNumSum)] #记录父节点
ordn[0],used[startPoint]=startPoint,1
pointNum=0
answer=[]
def dfs(curPoint):
nonlocal pointNum
if used[curPoint]==-1:
pointNum+=1
ordn[pointNum]=curPoint
used[curPoint]=1
if listRow[curPoint][pointNumSum] >= 1: #如果还存在可以往下寻找的点
for x in range(0,pointNumSum):
if listRow[curPoint][x]==1 and used[x]==-1: #找到第一个点
listRow[x][pointNumSum]=listRow[x][pointNumSum]-1 #剩下还有x-1个点相连
listRow[curPoint][pointNumSum]=listRow[curPoint][pointNumSum]-1
pointNum+=1
ordn[pointNum]=x #记录序列中第N点的编号,1..pointNumSum
par[pointNum]=curPoint #记录序列中第N点的父节点编号
used[x]=1
dfs(x) #深度优先
for y in range(0,pointNumSum): #按次序检索
dfs(y)
for x in range(0,pointNumSum):
ordn[x]+=1
par[x]+=1
answer.append(ordn)
answer.append(par)
return answer
dfsAnswer=dfsx(copy.deepcopy(listx),pointNumSum,startPoint)
print(dfsAnswer)
#Teil2 MDS
def domList(listRow):
connected=[0 for x in range(pointNumSum+1)] #connected:是否与支配点集中的点相连
answer=[]
count=49 #pointNumSum-1
for x in range(0,pointNumSum): #处理孤立点
if (listx[listRow[0][x]-1][pointNumSum]==0):
answer.append(listRow[0][x])
connected[listRow[0][x]]=1
for x in range(0,pointNumSum):
if (connected[listRow[0][count]]==0):
if listRow[1][count]!=0:
answer.append(listRow[1][count])
connected[listRow[1][count]]=1 #本身置1
for j in range(0,pointNumSum): #相连点置1
if listx[listRow[1][count]-1][j] == 1:
connected[j+1]=1
else:
connected[listRow[0][count]]=1
answer.append(listRow[0][count])
for j in range(0,pointNumSum):
if listx[listRow[0][count]-1][j] == 1:
connected[j+1]=1
count-=1 #仅为循环计数器
return answer
print('')
print(domList(copy.deepcopy(dfsAnswer)))
'''
#尝试暴力过round1