• <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 糯米 閱讀(1074) 評論(0)  編輯 收藏 引用 所屬分類: POJ

            亚洲国产成人精品无码久久久久久综合| 青青青国产精品国产精品久久久久 | 国产精品对白刺激久久久| 久久精品国产亚洲精品2020| 午夜不卡888久久| 久久人人爽人人人人爽AV | 99久久99久久精品国产| 国产精品一区二区久久精品涩爱 | 久久亚洲精品无码播放| 国产产无码乱码精品久久鸭| 久久黄视频| 久久亚洲美女精品国产精品| 国产精品久久久久久吹潮| 久久久久亚洲AV无码专区体验| 久久久久亚洲av成人网人人软件| 国产精品天天影视久久综合网| 伊人久久大香线蕉综合热线| 精品999久久久久久中文字幕| 亚洲国产成人精品久久久国产成人一区二区三区综 | 久久艹国产| 国产99久久久国产精品~~牛| 亚洲精品乱码久久久久久中文字幕 | MM131亚洲国产美女久久| 麻豆久久久9性大片| 久久激情五月丁香伊人| 国产精品九九久久免费视频 | 热99RE久久精品这里都是精品免费| 久久91精品国产91久久麻豆 | 国产精品美女久久久免费| 精品国产VA久久久久久久冰 | 99热热久久这里只有精品68| 97精品伊人久久大香线蕉app| 色8久久人人97超碰香蕉987| 久久久久久曰本AV免费免费| 久久婷婷人人澡人人爽人人爱| 欧洲国产伦久久久久久久 | 久久99热这里只有精品66| yy6080久久| 伊人久久久AV老熟妇色| 97精品国产97久久久久久免费| 综合人妻久久一区二区精品|