Python 随机生成DAG(有向无环图)

给校队选拔赛出了道DAG上的背包问题,需要生成DAG数据。

最开始使用的方法是先随机生成再判环,如果有环就重新生成。这种方法得到DAG的概率随着点数和边数的增加而急速降低,为了一个DAG要生成很多次,等很长时间。然后觉得这样的方法很stupid。。。

听了好甜给的先生成拓扑序的构造方法,这样可以保证生成的图里面没有环。

首先随机生成一个 1 到N 的permutation。这个permutation就是DAG的拓扑序,然后每次随机从前往后连边,这样就可以保证生成的是一个DAG了。真心膜拜

Life is short ,Use Python

from random import shuffle as sl
from random import randint as rd

def gn():
    num = rd(1,1000)
    return num
def w2f(f,num,fg):
    f.write(str(num))
    if fg==True:
        f.write('\n')
    else:
        f.write(' ')

def DataMake(c):
    MAXL =100000;
    f = open('data'+str(c)+'.in','w')
    n = 1000
    node = range(1,n+1)
    sl(node)
    sl(node)
    m = rd(1,min(n*n,5000))
    w2f(f,n,0);w2f(f,m,1)
    for i in range(0,m):
        p1 = rd (1,n-1)
        p2 = rd (p1+1,n)
        x = node[p1-1]
        y = node[p2-1]
        l = rd(1,MAXL)
        w = gn()
        w2f(f,x,0);w2f(f,y,0);w2f(f,l,0);w2f(f,w,1)
    k = gn()
    w2f(f,k,1)
    for i in range(0,k):
        w2f(f,gn(),1)
    print n,' node',m,' edges',k,'Queries'
    f.close()

DataMake(1)
print 'Done'


“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
评论 8

打赏作者

ZhouMu

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值