給校隊選拔賽出了道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'
