python实现数模Q1-Teil2

暴力大法好。

#-*- 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

猜你喜欢

转载自blog.csdn.net/zhubozhen/article/details/80379566
今日推荐