• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            糯米

            TI DaVinci, gstreamer, ffmpeg
            隨筆 - 167, 文章 - 0, 評論 - 47, 引用 - 0
            數據加載中……

            POJ 3155 Hard Life 最大密度子圖

            這題真不是蓋的,要是不看解題報告,恐怕一輩子都做不出來啦。。
            題目直接就是要解決一個叫做“最大密度子圖的問題”。
            就是在一簡單圖里面找出n個點,這n個點之間有m條邊,讓m/n最大。
            這種問題還是有點實際意義的。

            算法很復雜,找了一份高中生巨牛寫的文檔(90后真不是蓋的)。http://wenku.baidu.com/view/986baf00b52acfc789ebc9a9.html 。
            該文檔描述了一系列的最小割算法,其中包括這個“最大密度子圖問題”。
            我編碼能力差,不想寫c代碼,寫了一個py的腳本,能過官方數據,就是速度巨慢,開了一分鐘也沒跑完。。


            import sys

            def dinic(N, S, T, caps):
                to 
            = []
                cap 
            = []
                head 
            = [[] for i in range(N)]
                d 
            = [-1]*N
                ans 
            = 0
                cut 
            = set()

                
            for a, b, c in caps:
                    head[a].append(len(cap))
                    cap.append(c)
                    to.append(b)
                    head[b].append(len(cap))
                    cap.append(0)
                    to.append(a)

                
            def build():
                    
            for i in range(N):
                        d[i] 
            = -1
                    q 
            = [S]
                    d[S] 
            = 0
                    cut.clear()
                    
            while len(q):
                        x 
            = q[0]
                        
            del q[0]
                        
            for i in head[x]:
                            y 
            = to[i]
                            
            if cap[i] and d[y] == -1:
                                d[y] 
            = d[x] + 1
                                
            if y == T:
                                    
            return 1
                                q.append(y)
                                cut.add(y)
                    
            return 0

                
            def find(x, low):
                    
            if x == T:
                        
            return low
                    
            for i in head[x]:
                        y 
            = to[i]
                        
            if cap[i] and d[y] == d[x] + 1:
                            f 
            = find(y, min(low, cap[i]))
                            
            if f:
                                cap[i] 
            -= f
                                cap[i
            ^1+= f
                                
            return f
                    
            return 0

                
            while build():
                    
            while 1:
                        f 
            = find(S, sum(cap))
                        
            if f == 0:
                            
            break
                        ans 
            += f
                
                
            return ans, cut


            def max_weight_closure(V, edges):
                inf 
            = sum([abs(i) for i in V])
                caps 
            = [(a,b,inf) for a,b in edges]
                S 
            = len(V)
                T 
            = S + 1
                
            for i in range(len(V)):
                    
            if V[i] > 0:
                        caps.append((S,i,V[i]))
                    
            elif V[i] < 0:
                        caps.append((i,T,
            -V[i]))
                flow, cut 
            = dinic(len(V)+2, S, T, caps)
                
            return sum([V[i] for i in cut]), cut


            def max_density_subgraph(N, edges):

                
            def solve(g):
                    V 
            = [-g]*N
                    E 
            = []
                    
            for u,v in edges:
                        ve 
            = len(V)
                        E 
            += [(ve,u), (ve,v)]
                        V.append(
            1)
                    w, cut 
            = max_weight_closure(V, E)
                    
            if len(cut) == 0:
                        w 
            = -1
                    
            return w, cut

                l 
            = 1.0/N
                r 
            = len(edges)
                
            while l < r - 0.01:
                    m 
            = (l + r) / 2
                    
            if solve(m)[0] < 0:
                        r 
            = m
                    
            else:
                        l 
            = m
                w, cut 
            = solve(l)
                l 
            = [ i for i in cut if i < N]
                
            if len(l) == 0:
                    l 
            = [0]
                
            return l
                
            def get_density(N, edges, sel):
                e 
            = float(len([1 for a,b in edges if a in sel and b in sel]))
                
            return e/float(len(sel))

            fi 
            = open('3155.in')
            fo 
            = open('3155.out')
            = lambda x : [ int(i) for i in x.readline().split(' ') ]

            ti 
            = 0
            while 1:
                l 
            = g(fi)
                
            if len(l) == 0:
                    
            break
                N, M 
            = l
                
            print '----', ti
                
            print 'N M', N, M
                E 
            = [ [j-1 for j in g(fi)] for i in range(M)]
                cut 
            = max_density_subgraph(N, E)
                k 
            = g(fo)[0]
                ans 
            = [g(fo)[0]-1 for i in range(k)]
                d_ans 
            = get_density(N, E, ans)
                d_mine 
            = get_density(N, E, cut)
                
            print 'mine', d_mine
                
            print 'ans', d_ans
                
            if abs(d_ans - d_mine) > 0.001:
                    
            print 'error'
                    
            break
                ti 
            += 1




            posted on 2011-02-15 15:40 糯米 閱讀(1061) 評論(0)  編輯 收藏 引用 所屬分類: POJ

            久久九九精品99国产精品| 久久夜色精品国产噜噜亚洲a| 亚洲综合伊人久久大杳蕉| 久久久久亚洲精品中文字幕| 久久久中文字幕日本| 99久久精品国产一区二区| 国产亚洲精品自在久久| 国产精品久久久久一区二区三区| 国产真实乱对白精彩久久| 欧美亚洲国产精品久久高清| 亚洲国产欧美国产综合久久| 国内精品久久久久久野外| 一本色综合久久| 久久精品国产精品国产精品污| 欧美麻豆久久久久久中文| 久久99国产精品尤物| 亚洲&#228;v永久无码精品天堂久久| 久久精品人人做人人爽电影| 色综合久久最新中文字幕| 久久99久久99精品免视看动漫 | 狠狠干狠狠久久| 尹人香蕉久久99天天拍| 狠狠色婷婷综合天天久久丁香| 热99RE久久精品这里都是精品免费 | 久久青草国产手机看片福利盒子| 久久精品国产只有精品66| 久久人人爽人人爽人人AV东京热 | 久久综合九色综合欧美就去吻| 久久精品中文无码资源站| 99久久精品国产一区二区三区| 亚洲中文字幕久久精品无码APP| 久久精品国产网红主播| 91精品无码久久久久久五月天| 少妇久久久久久被弄到高潮| 一本大道久久a久久精品综合| 无码人妻精品一区二区三区久久久| 日本福利片国产午夜久久| 精品少妇人妻av无码久久| 久久亚洲熟女cc98cm| 日本国产精品久久| 欧美与黑人午夜性猛交久久久|