博士期间估计这可能是唯一一个要编程的作业,搞了半天弄出这个东西,放这里为以后用到的时候查找方便。

说来也是可笑,读博士期间发现大家对上课也都没什么兴趣,老师也是那么回事,都说博士期间学的课程是要有助于以后科研工作用的,但是为什么大家都是呵呵的态度,对于期末的编程作业大家连题目都难以做到记得无误,也是真心无奈。

(1) 给出判断一个图是无爪图正则(每个点的度数相同)4-连通的算法,并给出时间复杂性。

该问题其实应该是这样问的,给定一个4连通正则图,如何判断其是否为无爪图,并且该图是无K4图。

由于上课真心没听懂啥,课后自己查了一些资料,最后给出以下编程代码。

首先对代码分开给出,先给出 4正则图的生成代码,作为测试数据集的生成代码。

  1. """
  2. 测试数据集,matrix矩阵的生成, matrix矩阵为4正则图
  3. """
  4. def regularFour(N=10000):
  5. matrix={}
  6.  
  7. #matrix 初始化, value为集合
  8. for k in xrange(N):
  9. matrix[k]=set()
  10.  
  11. #未满足的Node列表
  12. unfillSet=range(N)
  13.  
  14. #赋值过程的终止条件,未满足Node数大于4
  15. while(len(unfillSet)>4):
  16. k=unfillSet.pop(0)
  17.  
  18. while(len(matrix[k])<4):
  19. #随机选取与其配对的点
  20. xTemp=random.choice(unfillSet)
  21.  
  22. #如果选取的点不满足条件则重选
  23. if(xTemp in matrix[k]):
  24. continue
  25.  
  26. matrix[k].add(xTemp)
  27. matrix[xTemp].add(k)
  28.  
  29. if(len(matrix[xTemp])==4):
  30. unfillSet.remove(xTemp)
  31.  
  32. """
  33. 未满足点个数小于等于4, 即0,1,2,3,4
  34. """
  35. #未满足点为0,1,2,3,4时
  36. while(True):
  37. #无法生成K4图,失败,返回0
  38. if(len(unfillSet)==1):
  39. #for i in unfillSet:
  40. # print i, matrix[i]
  41. return 0, matrix
  42.  
  43. #生成K4图,成功,返回1
  44. if(len(unfillSet)==0):
  45. return 1, matrix
  46.  
  47. k=unfillSet.pop(0)
  48.  
  49. for xTemp in copy.copy(unfillSet):
  50. if xTemp in matrix[k]:
  51. continue
  52. else:
  53. matrix[k].add(xTemp)
  54. matrix[xTemp].add(k)
  55.  
  56. if(len(matrix[xTemp])==4):
  57. unfillSet.remove(xTemp)
  58.  
  59. if(len(matrix[k])==4):
  60. break
  61. #失败
  62. if(len(matrix[k])!=4):
  63. #for i in unfillSet:
  64. # print i, matrix[i]
  65. return 0, matrix
  66.  
  67. return matrix

测试结果:

判断 测试图是否 为无爪 ,非K4图。

  1. def check(matrix):
  2. #node4Set 用于判断 K4
  3. node4Set=set()
  4. for k in matrix:
  5. for node3 in itertools.combinations(matrix[k], 3):
  6. #判断是否有爪
  7. a,b,c=node3
  8. if( (a not in matrix[b]) and (a not in matrix[c]) and (b not in matrix[c]) ):
  9. print "有爪"
  10. return 0
  11.  
  12. #判断是否为K4
  13. node4=tuple(sorted( list(node3)+[k] ))
  14. #判断4个顶点是否已经判断过
  15. if(node4 in node4Set):
  16. continue
  17.  
  18. node4Set.add(node4)
  19.  
  20. flag4=0
  21. for i in xrange(3):
  22. for j in xrange(i+1, 4):
  23. if(node4[i] in matrix[node4[j]]):
  24. flag4+=1
  25.  
  26. if(flag4==6):
  27. print "存在K4"
  28. return 0
  29. return 1

完全的代码:

  1. # -*- coding: utf-8 -*-
  2. import random
  3. import copy
  4. import pickle
  5. import itertools
  6. """
  7. 测试数据集,matrix矩阵的生成, matrix矩阵为4正则图
  8. """
  9. def regularFour(N=10000):
  10. matrix={}
  11.  
  12. #matrix 初始化, value为集合
  13. for k in xrange(N):
  14. matrix[k]=set()
  15.  
  16. #未满足的Node列表
  17. unfillSet=range(N)
  18.  
  19. #赋值过程的终止条件,未满足Node数大于4
  20. while(len(unfillSet)>4):
  21. k=unfillSet.pop(0)
  22.  
  23. while(len(matrix[k])<4):
  24. #随机选取与其配对的点
  25. xTemp=random.choice(unfillSet)
  26.  
  27. #如果选取的点不满足条件则重选
  28. if(xTemp in matrix[k]):
  29. continue
  30.  
  31. matrix[k].add(xTemp)
  32. matrix[xTemp].add(k)
  33.  
  34. if(len(matrix[xTemp])==4):
  35. unfillSet.remove(xTemp)
  36.  
  37. """
  38. 未满足点个数小于等于4, 即0,1,2,3,4
  39. """
  40. #未满足点为0,1,2,3,4时
  41. while(True):
  42. #无法生成K4图,失败,返回0
  43. if(len(unfillSet)==1):
  44. #for i in unfillSet:
  45. # print i, matrix[i]
  46. return 0, matrix
  47.  
  48. #生成K4图,成功,返回1
  49. if(len(unfillSet)==0):
  50. return 1, matrix
  51.  
  52. k=unfillSet.pop(0)
  53.  
  54. for xTemp in copy.copy(unfillSet):
  55. if xTemp in matrix[k]:
  56. continue
  57. else:
  58. matrix[k].add(xTemp)
  59. matrix[xTemp].add(k)
  60.  
  61. if(len(matrix[xTemp])==4):
  62. unfillSet.remove(xTemp)
  63.  
  64. if(len(matrix[k])==4):
  65. break
  66. #失败
  67. if(len(matrix[k])!=4):
  68. #for i in unfillSet:
  69. # print i, matrix[i]
  70. return 0, matrix
  71.  
  72. return matrix
  73.  
  74. def check(matrix):
  75. #node4Set 用于判断 K4
  76. node4Set=set()
  77. for k in matrix:
  78. for node3 in itertools.combinations(matrix[k], 3):
  79. #判断是否有爪
  80. a,b,c=node3
  81. if( (a not in matrix[b]) and (a not in matrix[c]) and (b not in matrix[c]) ):
  82. print "有爪"
  83. return 0
  84.  
  85. #判断是否为K4
  86. node4=tuple(sorted( list(node3)+[k] ))
  87. #判断4个顶点是否已经判断过
  88. if(node4 in node4Set):
  89. continue
  90.  
  91. node4Set.add(node4)
  92.  
  93. flag4=0
  94. for i in xrange(3):
  95. for j in xrange(i+1, 4):
  96. if(node4[i] in matrix[node4[j]]):
  97. flag4+=1
  98.  
  99. if(flag4==6):
  100. print "存在K4"
  101. return 0
  102. return 1
  103.  
  104. if __name__=="__main__":
  105. """
  106. 4正则数据生成
  107. """
  108. matrixList=[]
  109. try:
  110. f=open("back.dat", "rb")
  111. try:
  112. while(True):
  113. matrixList.append(pickle.load(f))
  114. except EOFError:
  115. pass
  116. f.close()
  117. except IOError:
  118. f=open("back.dat", "wb")
  119. num=0
  120. #图数目设置默认为 100
  121. while(num<100):
  122. ans, matrix=regularFour()
  123. if ans==1:
  124. num+=1
  125. #持久化
  126. pickle.dump(matrix, f)
  127. matrixList.append(matrix)
  128. f.close()
  129.  
  130. ###正式进行判断
  131. for i in xrange(100):
  132. print i, check(matrixList[i])

运行结果图:

个人感觉这个东西,这么说吧,随机生成的4连通4正则图 基本都是不满足这个条件的。

图论期末大作业编程题(如何判断一个4连通4正则图为无爪、无K4图)的更多相关文章

  1. C#期末大作业 消消乐 2017-06-01 18:11 275人阅读 评论(0) 收藏

    邻近期末,忙于刷题之余意识到期末大作业来不及了,匆匆赶下了作业,虽说做的很是粗糙,但完全原创的 下载链接 https://pan.baidu.com/s/1cCNLr4 大体的做大约3天完成了: 第一 ...

  2. [留念贴] C#开发技术期末大作业——星月之痕

    明天就要去上海大学参加 2015赛季 ACM/ICPC最后一场比赛 —— EC-Final,在这之前,顺利地把期末大作业赶出来了. 在这种期末大作业10个人里面有9个是从网上下载的国内计算机水平五六流 ...

  3. 中国MOOC_零基础学Java语言_期末考试的编程题_1二进制的前导的零

    期末考试的编程题 返回   这是期末考试的编程题,在60分钟内,你可以多次提交,直到正确为止. 温馨提示: 1.本次考试属于Online Judge题目,提交后由系统即时判分. 2.学生可以在考试截止 ...

  4. Java Web大作业——编程导航系统

    title: Java Web大作业--编程导航系统 categories: - - 计算机科学 - Java abbrlink: 40bc48a1 date: 2021-12-29 00:37:35 ...

  5. Web程序设计基础期末大作业——模仿QQ飞车手游S联赛官网编写的网页

    QQ飞车手游是我非常喜欢的游戏,也是我现在为数不多的常在玩的游戏,刚好我Web程序设计基础的大作业是要做一套网站,我就借此机会模仿飞车S联赛官网的页面自己做了一个网页,又加了一些自己的元素,由于我做这 ...

  6. 大一上C语言期末大作业-成绩管理系统

    都过了半年的作业了,觉得做过去得留下点什么,所以整理了代码发一下博客. 声明:程序在DevC++下用c文件模式可以正常编译使用.(控制台程序) 程序结构:

  7. 第二次作业 编程题 PAT 1001A+B Format

    Github的object-oriented仓库:1001.A+BFormat(20) 1.解题的思路过程 在之前学习C语言时曾经碰到过类似的将数字转换成字符输出的情况,这道题目要求输出的数字每三个间 ...

  8. k2datas 基础编程题,判断字符串是否有重复串

    package String; public class DuplicateString { public static boolean isDup(String s) throws Exceptio ...

  9. 剑指Offer_编程题-003 - 输入一个链表,按链表值从尾到头的顺序返回一个ArrayList

    如题 (总结) 首节点也存放了值,所以ListNode t = listNode; 直接从头开始遍历即可. 简单题目,但是构建的时候出了点问题,毕竟需要自己简单测测. 掌握链表的构建方法, 还要根据题 ...

随机推荐

  1. (2)Mac环境搭建

    创建HelloWorld项目 将刚才下载的压缩包解压到你指定的文件夹里. 进入到目录cocos2d-x-3.2alpha0/tools/cocos2d-console/bin/cocos.py 打开终 ...

  2. cocos代码研究(21)Widget子类Text,TextAtlas,TextBMFont学习笔记

    理论基础 Text类又称ttf格式文本,可以用ttf文件或者系统自带字体,支持文字多,但是ttf文件格式体积大,渲染速度慢: TextBMFont类又称fnt格式文本,纹理创建,根据纹理上有的文字来显 ...

  3. (转)关于EntityFramework中连接字符串的说明

    1. 基本格式 <connectionStrings> <add name="MyEntities" connectionString="metadat ...

  4. Linux 中的 Service

    参考: cnblogs.com/xiaofan21 - linux service和daemon cnblogs.com/xuange306 - linux service命令常见使用方法 cnblo ...

  5. Action<>和Func<> 区别

    其实他们两个都是委托[代理]的简写形式. 一.[action<>]指定那些只有输入参数,没有返回值的委托 Delegate的代码: public delegate void myDeleg ...

  6. 报错org.openqa.selenium.WebDriverException: disconnected: unable to connect to renderer解决方法

    做自动化时经常会遇到不兼容的问题,比如以下简单的脚本,主要是打开浏览器,然后最大化窗口,打开百度,输入内容搜索,代码如下: package com.gs.selenium; import org.op ...

  7. NOSQL数据库-Redis

    官方提倡使用Linux版的Redis,所以官网值提供了Linux版的Redis下载,我们可以从GitHub上下载window版的Redis,具体链接地址如下: · 官网下载地址:http://redi ...

  8. Python3基础 try-except 几个异常采取同样的处理方法

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...

  9. ubuntu下各类快捷键汇总记录

    一.环境 Ubuntu 16.04 二.快捷键汇总如下 2.1 将图形界面下的terminal最大化:ctrl+super+向上的方向键 2.2 将图形界面下的terminal最小化:ctrl+sup ...

  10. Java8 Predicate

    code: package com.qhong; import java.util.ArrayList; import java.util.Arrays; import java.util.List; ...