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'


 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM