应吴老师之邀,写了个数据生成器。

目前这个数据生成器可以保证生成的数据都是合法的,且效率也还不错。只是在建立普通连通图的时候zyy偷懒了,直接把所有点串起来从而保证图的连通。如果有大神有更好的方法请不吝指教,zyy不胜感谢~~

下面是代码:

  1. 1 #include<cstdio>
  2. 2 #include<ctime>
  3. 3 #include<cstring>
  4. 4 #include<cstdlib>
  5. 5 #include<cmath>
  6. 6 #include<vector>
  7. 7 using namespace std;
  8. 8 #define MAXN 40
  9. 9 #define MAXM 100
  10. 10
  11. 11 int A[MAXN+10][MAXN+10];
  12. 12 int d[MAXN+10];
  13. 13
  14. 14 int n, m;
  15. 15
  16. 16 int GetRand(int L, int R)
  17. 17 {
  18. 18 int Len = R - L + 1;
  19. 19 int Ret = rand() * rand() % Len + L;
  20. 20 return Ret;
  21. 21 }
  22. 22
  23. 23 inline void Addedge(int u,int v,int o)
  24. 24 {
  25. 25 A[u][v]+=o;A[v][u]+=o;
  26. 26 d[u]+=o;d[v]+=o;
  27. 27 m+=o;
  28. 28 }
  29. 29
  30. 30 void gen()
  31. 31 {
  32. 32 int i, j, k, t;
  33. 33 bool Again;
  34. 34 memset(A, 0, sizeof(A));
  35. 35 memset(d, 0, sizeof(d));
  36. 36 for(i=1;i<n;i++)//保证图的连通
  37. 37 {
  38. 38 A[i][i+1]++;A[i+1][i]++;
  39. 39 d[i]++;d[i+1]++;
  40. 40 }
  41. 41 for(i=1;i<=m-n+1;i++)//剩下的边随机连接
  42. 42 {
  43. 43 do{
  44. 44 j=GetRand(1,n);
  45. 45 k=GetRand(1,n);
  46. 46 if(j==k) continue;
  47. 47 A[j][k]++;A[k][j]++;
  48. 48 d[j]++;d[k]++;
  49. 49 break;
  50. 50 }while(true);
  51. 51 }
  52. 52 //调整边,使所有的顶点的度为偶数
  53. 53 for(i=1;i<=n;i++)
  54. 54 {
  55. 55 if(d[i]%2)//如果i点度为奇数,就再找一个度为奇数的点
  56. 56 {
  57. 57 for(j=i+1;j<=n;j++)
  58. 58 {
  59. 59 if(d[j]%2)
  60. 60 {
  61. 61 if(A[i][j])//i、j之间有边
  62. 62 {
  63. 63 if(d[i]!=1&&d[j]!=1)//i、j之间不止一条边,则删掉一条边
  64. 64 {
  65. 65 Addedge(i,j,-1);
  66. 66 break;
  67. 67 }
  68. 68 else
  69. 69 {
  70. 70 continue;
  71. 71 }
  72. 72 }
  73. 73 else//i、j之间没有边,则连接i、j
  74. 74 {
  75. 75 Addedge(i,j,1);
  76. 76 break;
  77. 77 }
  78. 78 }
  79. 79 }
  80. 80 if(j>n)
  81. 81 {
  82. 82 for(k=i+1;k<=n;k++)
  83. 83 {
  84. 84 if(d[k])
  85. 85 break;
  86. 86 }
  87. 87 t=k;//找一个度为奇数的顶点t
  88. 88 for(k=1;k<i;k++)//再找一个度为偶数的顶点k,若k与i、t不相连,则连接tk、ik
  89. 89 {
  90. 90 if(!A[t][k]&&!A[k][i])
  91. 91 {
  92. 92 Addedge(t,k,1);
  93. 93 Addedge(i,k,1);
  94. 94 break;
  95. 95 }
  96. 96 }
  97. 97 Again=false;
  98. 98 if(k>=i)//需要重新调整
  99. 99 {
  100. 100 for(t=1;t<=n;t++)//连接i与任意一个不相连的顶点t
  101. 101 {
  102. 102 if(!A[t][i]&&i!=t)
  103. 103 {
  104. 104 Addedge(t,i,1);
  105. 105 Again=true;
  106. 106 break;
  107. 107 }
  108. 108 }
  109. 109 if(t>n)//如果找不到这样的t,在确保图的连通的条件下删掉一条边
  110. 110 {
  111. 111 for(t=1;t<=n;t++)
  112. 112 {
  113. 113 if(d[t]>1)
  114. 114 {
  115. 115 Addedge(t,i,-1);
  116. 116 Again=true;
  117. 117 break;
  118. 118 }
  119. 119 }
  120. 120 }
  121. 121 }
  122. 122 if(Again)
  123. 123 i=0;
  124. 124 }
  125. 125 }
  126. 126 }
  127. 127 }
  128. 128
  129. 129
  130. 130 int main()
  131. 131 {
  132. 132 //freopen("data4.in","w",stdout);
  133. 133 srand(time(NULL));
  134. 134 int cas =10000;//GetRand(1, 1);
  135. 135 int i,j;
  136. 136 printf("%d\n", cas);
  137. 137 while(cas-- > 0)
  138. 138 {
  139. 139 n = GetRand(MAXN/5*3, MAXN);
  140. 140 m = GetRand(MAXM/5*3, MAXM);
  141. 141 gen();
  142. 142 printf("%d\n", m);
  143. 143 for(i=1;i<n;i++)
  144. 144 for(j=i+1;j<=n;j++)
  145. 145 while(A[i][j]-->0)
  146. 146 printf("%d %d\n",i,j);
  147. 147 }
  148. 148 return 0;
  149. 149 }

[数据生成器]UVA10054 The Necklace的更多相关文章

  1. Mockjs,模拟数据生成器

    (推荐使用)Mock.js是一款模拟数据生成器,旨在帮助前端攻城师独立于后端进行开发,帮助编写单元测试. 提供了以下模拟功能: 1. 根据数据模板生成模拟数据. 2. 模拟Ajax请求,生成并返回模拟 ...

  2. UVA10054 The Necklace

    UVA10054 The Necklace 链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=18806 [思路] 欧拉回路 ...

  3. [CF787D]遗产(Legacy)-线段树-优化Dijkstra(内含数据生成器)

    Problem 遗产 题目大意 给出一个带权有向图,有三种操作: 1.u->v添加一条权值为w的边 2.区间[l,r]->v添加权值为w的边 3.v->区间[l,r]添加权值为w的边 ...

  4. 【BZOJ3671】【NOI2014】随机数据生成器(贪心)

    [BZOJ3671][NOI2014]随机数据生成器(贪心) 题面 BZOJ 题解 前面的模拟 真的就是语文阅读理解题目 理解清楚题目意思 然后就会发现要求的就是一个贪心 从小往大枚举,检查当前数能不 ...

  5. 【awesome-dotnet-core-learning】(3)-Bogus-假数据生成器

    [awesome-dotnet-core-learning](3)-Bogus-假数据生成器 简介 Bogus一个简单而强大的假数据生成器,用于C#,F#和VB.NET.从著名的faker.js移植过 ...

  6. 让前端独立于后端进行开发,模拟数据生成器Mock.js

    让前端独立于后端进行开发,模拟数据生成器Mock.jsMock.js 是一款模拟数据生成器,旨在帮助前端攻城师独立于后端进行开发,帮助编写单元测试. Home · nuysoft/Mock Wiki ...

  7. HDU P3341 Lost's revenge 题解+数据生成器

    Lost and AekdyCoin are friends. They always play "number game"(A boring game based on numb ...

  8. 【scikit-learn】06:make_blobs聚类数据生成器

      版权声明:本文为博主原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/kevinelstri/article/ ...

  9. 如何从0到1的构建一款Java数据生成器-第二章

    前提 在上一章我们提到了并且解决了几只拦路虎,承上启下,下面我们一起来实现一款数据生成器. 对外API /** * @description: 本地数据生成API * @author: peter * ...

随机推荐

  1. leetcode 509. 斐波那契数

    问题描述 斐波那契数,通常用 F(n) 表示,形成的序列称为斐波那契数列.该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和.也就是: F(0) = 0,   F(1) = 1 F(N) ...

  2. Book of the Dead 死者之书Demo工程回顾与学习

    1.前言 一转眼离Book of the Dead Environment Demo开放下载已过去多年,当时因为技术力有限,以及对HDRP理解尚浅, 所以这篇文章一直搁浅到了现在.如今工作重心已转向U ...

  3. Typecho 如何安装主题和插件

    Typecho的主题和插件都安装在Typecho的usr目录下,这个不是主机根目录的usr,是Typecho本身文件夹根目录下的usr. 里面有两个文件夹,plugins存放插件,themes存放主题 ...

  4. Collection类集

    1.Collection接口 Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(Elements).一些Collection允许相同的 ...

  5. Android 12(S) 图形显示系统 - 应用建立和SurfaceFlinger的沟通桥梁(三)

    1 前言 上一篇文章中我们已经创建了一个Native示例应用,从使用者的角度了解了图形显示系统API的基本使用,从这篇文章开始我们将基于这个示例应用深入图形显示系统API的内部实现逻辑,分析运作流程. ...

  6. golang中结构体中的嵌套

    package main import "fmt" type Base struct { name string } func (b *Base) m1() int { retur ...

  7. 『无为则无心』Python基础 — 41、Python中文件的读写操作(一)

    目录 1.文件操作步骤 2.文件的读写操作 (1)文件的打开 (2)打开文件模式 (3)获取一个文件对象 (4)关于文件路径 1.文件操作步骤 当我们要读取或者写入文件时,我们需要打开文件,在操作完毕 ...

  8. Supervisor多进程管理 异常自动重启 可视化管理

    一.序言 Supervisor是多进程管理工具,在Docker中相关联的进程能够通过supervisor来管理. 微服务项目开发阶段,可用于微服务子项目的启动管理. 支持web可视化管理,能够极大方面 ...

  9. 势能分析(splay分析)

    定义 第\(x\)次操作后,势能为\(\phi(x)\),该操作实际复杂度\(c(x)\),均摊复杂度\(a(x)\). 定义\(a(x)=c(x)+\phi(x)-\phi(x-1)\). 那么总复 ...

  10. LockSupport、wait()、notify()

    LockSupport 名词解释 LockSupport是一个在JUC包里的线程阻塞工具类,所有的方法都是静态方法,主要用途是让线程在任意位置阻塞,广泛应用在AQS和各种JUC的锁中. 代码 publ ...