ACM 题目数据生成利器 CYaron

发布时间:2019年12月13日 阅读:482 次

https://github.com/luogu-dev/cyaron

https://github.com/luogu-dev/cyaron/wiki/%E5%9B%BE-Graph

以ACM SDUTOJ3363为例,生成题目测试数据

#!/usr/bin/env python

from cyaron import * # 引入CYaRon的库
import random
_n = ati([0, 7, 50, 200]) # ati函数将数组中的每一个元素转换为整形,方便您可以使用1E4一类的数来表示数据大小
_m = ati([0, 11, 100, 500]) 

def oper(x):
    return "%d %d %d %d" % (x.start, x.end, x.weight[0], x.weight[1])
def wg():
    return [random.randint(1, 100), random.randint(1, 500)]
    
# 这是一个图论题的数据生成器,该题目在洛谷的题号为P1339
for i in range(1, 4): # 即在[1, 4)范围内循环,也就是从1到3
    test_data = IO(file_prefix="data", data_id=i+1) # 生成 heat[1|2|3].in/out 三组测试数据

    test_data.input_writeln(1)
    n = _n[i] # 点数
    m = _m[i] # 边数
    s = randint(1, n-1) # 源点,随机选取一个
    t = randint(s+1, n) # 汇点,随机选取一个
    test_data.input_writeln(n, m, s, t) # 写入到输入文件里,自动以空格分割并换行

    graph = Graph.graph(n, m, weight_gen=wg,self_loop=False, repeated_edges=False) # 生成一个n点,m边的无向图,边权范围是1到20 # 生成一个n点,m边的随机图,边权限制为5
    #test_data.input_writeln(graph) # 自动写入到输入文件里,默认以一行一组u v w的形式输出
    test_data.input_writeln(graph.to_str(output=oper))
    test_data.output_gen("C:\\Users\\Lenovo\\Desktop\\gen\\asdaa.exe") # 标程编译后的可执行文件,不需要freopen等,CYaRon自动给该程序输入并获得输出作为.out


需要注意的是,如果想要生成一个随机无向+无重边无自环的完全图,是非常耗时间的。

虽然代码已经提供了很完善的生成方案,但是还是需要出题者仔细思考题目,避免出现大问题。

Tag:
相关文章

发表评论: