[数据生成器]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,布布扣,bubuko.com

时间: 2024-10-25 08:46:51

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

[题解]UVA10054 The Necklace

链接:http://vjudge.net/problem/viewProblem.action?id=18806 描述:给出一堆珠子,每个珠子有两种颜色,有一端颜色相同的珠子可以串在一起,问是否可以把所有珠子串在一起,并求其中一种方案. 思路:欧拉回路 以颜色作为节点,以珠子作为边建图,无向图. 下面是我的实现: 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 using namespac

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

Problem 遗产 题目大意 给出一个带权有向图,有三种操作: 1.u->v添加一条权值为w的边 2.区间[l,r]->v添加权值为w的边 3.v->区间[l,r]添加权值为w的边 求st点到每个点的最短路 Solution 首先我们思考到,若是每次对于l,r区间内的每一个点都执行一次加边操作,不仅耗时还耗空间. 那么我们要想到一个办法去优化它.一看到lr区间,我们就会想到线段树对吧. 没错啦这题就是用线段树去优化它. 首先我们建一棵线段树,然后很容易想到,我们只需要把这一棵线段树当做

c++随机数据生成器

这是随机数据生成器,可以在noi上检测...... #include<iostream> #include<time.h> #include<cstdio> #include<stdlib.h> using namespace std; int main() { freopen("random.txt","w",stdout); long long a,b,n,cou;//cou:数据个数:  cin>>a

【ThinkingInJava】44、数据生成器

<pre name="code" class="java">//: net/mindview/util/Generator.java // A generic interface. package net.mindview.util; public interface Generator<T> { T next(); } ///:~ /** * 书本:<Thinking In Java> * 功能:数据生成器--策略设计模式 *

前端模拟数据生成器

摘要: ?随着用户体验的重要性越来越高,目前前端和后台的解耦已经越来越明显了,这也加大了前后端的配合工作.在前端开发过程中可能我们需要一些后台返回的数据来完成交互效果,但是后台开发人员并没有完成后台功能,此时我们只能等,但是这样必然影响了开发进度,浪费了时间.有很多种解决方法,如果后端解决的话,那就是先定义接口,然后将假数据直接返回.如果在前端解决的话,前端搭建自己的服务,不依赖后端.作为前端工程师,今天我分享下另一种前端解决方案,mock服务. 简介: Mock.js 是一款模拟数据生成器,旨

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

[BZOJ3671][NOI2014]随机数据生成器(贪心) 题面 BZOJ 题解 前面的模拟 真的就是语文阅读理解题目 理解清楚题目意思 然后就会发现要求的就是一个贪心 从小往大枚举,检查当前数能不能选 如果能选 就会限制其他行的左右能够到达的范围 暴力修改一下 然后就很愉快的\(AC\)了 这题别的不卡 卡空间,卡格式 我也是醉了 #include<iostream> #include<cstdio> #include<cstdlib> #include<cs

Keras用动态数据生成器(DataGenerator)和fitgenerator动态训练模型

  最近做Kaggle的图像分类比赛:RSNA Intracranial Hemorrhage Detection (https://www.kaggle.com/c/rsna-intracranial-hemorrhage-detection/overview)以及阅读Yolov3 源码的时候接触到深度学习训练时一个有趣的技巧,那就是构造生成器generator 并且用Keras 的fit_generator来批量生成数据,释放内存,该方法适合于大规模数据集的训练.一个DataGenerato

Uva10054 The Necklace

Uva10054 欧拉回路 题意:给n个珠子,每个珠子的两端的颜色不同.问能否组成一条项链,两颗相邻的珠子相邻的两端颜色相同. 思路:把颜色看做点.珠子看做边.每一个珠子在两种颜色之间连边.无向图中任意一点的度数都为偶数,则该图具有欧拉回路.然后通过euler函数来输出即可. /* ID: onlyazh1 LANG: C++ TASK: The Necklace */ #include<iostream> #include<cmath> #include<stack>

[BZOJ1455]罗马游戏-斜堆/左偏树-并查集(+数据生成器)

Problem 遗产 题目大意 罗马皇帝很喜欢玩杀人游戏. 他的军队里面有n个人,每个人都是一个独立的团.最近举行了一次平面几何测试,每个人都得到了一个分数. 皇帝很喜欢平面几何,他对那些得分很低的人嗤之以鼻.他决定玩这样一个游戏. 它可以发两种命令: 1. Merger(i, j).把i所在的团和j所在的团合并成一个团.如果i, j有一个人是死人,那么就忽略该命令. 2. Kill(i).把i所在的团里面得分最低的人杀死.如果i这个人已经死了,这条命令就忽略. 皇帝希望他每发布一条kill命令