[数据生成器]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 * ...
随机推荐
- leetcode 509. 斐波那契数
问题描述 斐波那契数,通常用 F(n) 表示,形成的序列称为斐波那契数列.该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和.也就是: F(0) = 0, F(1) = 1 F(N) ...
- Book of the Dead 死者之书Demo工程回顾与学习
1.前言 一转眼离Book of the Dead Environment Demo开放下载已过去多年,当时因为技术力有限,以及对HDRP理解尚浅, 所以这篇文章一直搁浅到了现在.如今工作重心已转向U ...
- Typecho 如何安装主题和插件
Typecho的主题和插件都安装在Typecho的usr目录下,这个不是主机根目录的usr,是Typecho本身文件夹根目录下的usr. 里面有两个文件夹,plugins存放插件,themes存放主题 ...
- Collection类集
1.Collection接口 Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(Elements).一些Collection允许相同的 ...
- Android 12(S) 图形显示系统 - 应用建立和SurfaceFlinger的沟通桥梁(三)
1 前言 上一篇文章中我们已经创建了一个Native示例应用,从使用者的角度了解了图形显示系统API的基本使用,从这篇文章开始我们将基于这个示例应用深入图形显示系统API的内部实现逻辑,分析运作流程. ...
- golang中结构体中的嵌套
package main import "fmt" type Base struct { name string } func (b *Base) m1() int { retur ...
- 『无为则无心』Python基础 — 41、Python中文件的读写操作(一)
目录 1.文件操作步骤 2.文件的读写操作 (1)文件的打开 (2)打开文件模式 (3)获取一个文件对象 (4)关于文件路径 1.文件操作步骤 当我们要读取或者写入文件时,我们需要打开文件,在操作完毕 ...
- Supervisor多进程管理 异常自动重启 可视化管理
一.序言 Supervisor是多进程管理工具,在Docker中相关联的进程能够通过supervisor来管理. 微服务项目开发阶段,可用于微服务子项目的启动管理. 支持web可视化管理,能够极大方面 ...
- 势能分析(splay分析)
定义 第\(x\)次操作后,势能为\(\phi(x)\),该操作实际复杂度\(c(x)\),均摊复杂度\(a(x)\). 定义\(a(x)=c(x)+\phi(x)-\phi(x-1)\). 那么总复 ...
- LockSupport、wait()、notify()
LockSupport 名词解释 LockSupport是一个在JUC包里的线程阻塞工具类,所有的方法都是静态方法,主要用途是让线程在任意位置阻塞,广泛应用在AQS和各种JUC的锁中. 代码 publ ...