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

            国产99久久久国产精免费| 精品久久久久久中文字幕人妻最新| 97久久综合精品久久久综合| 91精品国产乱码久久久久久| .精品久久久麻豆国产精品| 精品综合久久久久久97超人| 久久免费国产精品| 无码人妻精品一区二区三区久久久 | 99久久99久久精品国产片果冻| 精品久久久久久中文字幕大豆网| 久久久久久无码Av成人影院| 国产精品99久久久久久猫咪| 亚洲狠狠婷婷综合久久蜜芽| 国产精品女同一区二区久久| 99久久国产综合精品女同图片 | 国产精品欧美久久久久天天影视| 欧美粉嫩小泬久久久久久久 | 无码人妻精品一区二区三区久久久| 2021少妇久久久久久久久久| 亚洲婷婷国产精品电影人久久| 久久丫精品国产亚洲av不卡| 欧美午夜精品久久久久久浪潮| 久久久久久亚洲Av无码精品专口| 久久人人爽人人爽人人片AV麻豆| 精品久久久久香蕉网| 亚洲国产精品无码久久久不卡| 久久精品国产99久久香蕉| 狠狠干狠狠久久| 久久国产精品无码一区二区三区| 亚洲国产成人精品久久久国产成人一区二区三区综 | 亚洲第一永久AV网站久久精品男人的天堂AV | 久久精品人成免费| 久久婷婷五月综合国产尤物app| 91亚洲国产成人久久精品| 久久精品亚洲一区二区三区浴池 | 69SEX久久精品国产麻豆| 99精品久久久久久久婷婷| 久久精品国产亚洲αv忘忧草 | 日本久久久久久久久久| 久久久久国产一区二区| 久久久久国产精品|