[数据生成器]UVA10054 The Necklace
应吴老师之邀,写了个数据生成器。
目前这个数据生成器可以保证生成的数据都是合法的,且效率也还不错。只是在建立普通连通图的时候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的更多相关文章
- Mockjs,模拟数据生成器
(推荐使用)Mock.js是一款模拟数据生成器,旨在帮助前端攻城师独立于后端进行开发,帮助编写单元测试. 提供了以下模拟功能: 1. 根据数据模板生成模拟数据. 2. 模拟Ajax请求,生成并返回模拟 ...
- UVA10054 The Necklace
UVA10054 The Necklace 链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=18806 [思路] 欧拉回路 ...
- [CF787D]遗产(Legacy)-线段树-优化Dijkstra(内含数据生成器)
Problem 遗产 题目大意 给出一个带权有向图,有三种操作: 1.u->v添加一条权值为w的边 2.区间[l,r]->v添加权值为w的边 3.v->区间[l,r]添加权值为w的边 ...
- 【BZOJ3671】【NOI2014】随机数据生成器(贪心)
[BZOJ3671][NOI2014]随机数据生成器(贪心) 题面 BZOJ 题解 前面的模拟 真的就是语文阅读理解题目 理解清楚题目意思 然后就会发现要求的就是一个贪心 从小往大枚举,检查当前数能不 ...
- 【awesome-dotnet-core-learning】(3)-Bogus-假数据生成器
[awesome-dotnet-core-learning](3)-Bogus-假数据生成器 简介 Bogus一个简单而强大的假数据生成器,用于C#,F#和VB.NET.从著名的faker.js移植过 ...
- 让前端独立于后端进行开发,模拟数据生成器Mock.js
让前端独立于后端进行开发,模拟数据生成器Mock.jsMock.js 是一款模拟数据生成器,旨在帮助前端攻城师独立于后端进行开发,帮助编写单元测试. Home · nuysoft/Mock Wiki ...
- HDU P3341 Lost's revenge 题解+数据生成器
Lost and AekdyCoin are friends. They always play "number game"(A boring game based on numb ...
- 【scikit-learn】06:make_blobs聚类数据生成器
版权声明:本文为博主原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/kevinelstri/article/ ...
- 如何从0到1的构建一款Java数据生成器-第二章
前提 在上一章我们提到了并且解决了几只拦路虎,承上启下,下面我们一起来实现一款数据生成器. 对外API /** * @description: 本地数据生成API * @author: peter * ...
随机推荐
- GIL全局解释器锁、死锁现象、python多线程的用处、进程池与线程池理论
昨日内容回顾 僵尸进程与孤儿进程 # 僵尸进程: 所有的进程在运行结束之后并不会立刻销毁(父进程需要获取该进程的资源) # 孤儿进程: 子进程正常运行 但是产生该子进程的父进程意外死亡 # 守护进程: ...
- Go 循环控制
#### Go 循环控制昨天有工作要忙, 断更一天,不过学习的事情,还是每天要坚持; 我还有头发, 还能学习^_^.***倘若我心中的山水, 你眼中都看到***上一节学习完流程控制,总结一下switc ...
- Kubernetes:Pod基础知识总结
Blog:博客园 个人 官方文档详尽介绍了Pod的概念. 概念 Pods are the smallest deployable units of computing that you can cre ...
- python32day
内容回顾 操作系统的历史 多道操作系统 分时操作系统 实时操作系统 进程 线程 并行和并发 同步和异步 阻塞和非阻塞 今日内容 进程的三状态图 进程的调度算法 给所有进程分配资源或者分配CPU使用权的 ...
- stram流char[]保存,支持中文,Filestram需要先转byte[]才能使用,但是性能更好《转载》
学习流的使用时(stream类),逐步遇到新的理解,记录一下 1.FileStream流是处理byte[],默认UTF8类型 当你使用wirte方法时将非byte类型的输入内容,先将内容通过转换为字节 ...
- atomic 原子自增工程用法案例
案例 1 : 简单用法 atomic_int id; atomic_fetch_add(&id, 1) atomic_uint id; atomic_fetch_add(&id, 1) ...
- 基于java 合并.doc和docx格式的Word文件
注:摘录自 https://www.cnblogs.com/shenzhouyh/articles/7243805.html 之前用过jacob 合并.doc,但是是有jacob有弊端: 服务器必须是 ...
- 入门-k8s集群环境搭建(二)
对于 Kubernetes 初学者,在搭建K8S集群时,推荐在阿里云或腾讯云采购如下配置:(您也可以使用自己的虚拟机.私有云等您最容易获得的 Linux 环境) 至少2台 2核4G 的服务器 Cent ...
- android怎么做表格显示数据
实现思路:最底层(父级)背景为黑色,最上层(子级)背景为白色,然后父子组件之间存在一丝间隔即可显示出类似边框的线. 本次主要利用Android中的TableRow等实现,其他类比也可以实现效果. &l ...
- Linux之shell变量
一.变量名的规范 定义形如:class_name='xiaohemiao' 使用形如:echo $class_name 1.变量名后面的等号左右不能有空格 2.命名只能使用英文字母,数字和下划线,首个 ...