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

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

下面是代码:

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

    昨日内容回顾 僵尸进程与孤儿进程 # 僵尸进程: 所有的进程在运行结束之后并不会立刻销毁(父进程需要获取该进程的资源) # 孤儿进程: 子进程正常运行 但是产生该子进程的父进程意外死亡 # 守护进程: ...

  2. Go 循环控制

    #### Go 循环控制昨天有工作要忙, 断更一天,不过学习的事情,还是每天要坚持; 我还有头发, 还能学习^_^.***倘若我心中的山水, 你眼中都看到***上一节学习完流程控制,总结一下switc ...

  3. Kubernetes:Pod基础知识总结

    Blog:博客园 个人 官方文档详尽介绍了Pod的概念. 概念 Pods are the smallest deployable units of computing that you can cre ...

  4. python32day

    内容回顾 操作系统的历史 多道操作系统 分时操作系统 实时操作系统 进程 线程 并行和并发 同步和异步 阻塞和非阻塞 今日内容 进程的三状态图 进程的调度算法 给所有进程分配资源或者分配CPU使用权的 ...

  5. stram流char[]保存,支持中文,Filestram需要先转byte[]才能使用,但是性能更好《转载》

    学习流的使用时(stream类),逐步遇到新的理解,记录一下 1.FileStream流是处理byte[],默认UTF8类型 当你使用wirte方法时将非byte类型的输入内容,先将内容通过转换为字节 ...

  6. atomic 原子自增工程用法案例

    案例 1 : 简单用法 atomic_int id; atomic_fetch_add(&id, 1) atomic_uint id; atomic_fetch_add(&id, 1) ...

  7. 基于java 合并.doc和docx格式的Word文件

    注:摘录自 https://www.cnblogs.com/shenzhouyh/articles/7243805.html 之前用过jacob 合并.doc,但是是有jacob有弊端: 服务器必须是 ...

  8. 入门-k8s集群环境搭建(二)

    对于 Kubernetes 初学者,在搭建K8S集群时,推荐在阿里云或腾讯云采购如下配置:(您也可以使用自己的虚拟机.私有云等您最容易获得的 Linux 环境) 至少2台 2核4G 的服务器 Cent ...

  9. android怎么做表格显示数据

    实现思路:最底层(父级)背景为黑色,最上层(子级)背景为白色,然后父子组件之间存在一丝间隔即可显示出类似边框的线. 本次主要利用Android中的TableRow等实现,其他类比也可以实现效果. &l ...

  10. Linux之shell变量

    一.变量名的规范 定义形如:class_name='xiaohemiao' 使用形如:echo $class_name 1.变量名后面的等号左右不能有空格 2.命名只能使用英文字母,数字和下划线,首个 ...