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