青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

糯米

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

POJ 3156 Interconnect 圖論+數論

題目的意思是:
給一個有n個點,m條邊的無向圖
兩點之間可以存在多條邊
現在每次隨機增加一條邊
問使得全部點都連通需要增加多少次(期望值)

首先,求出所有連通分量。用并查集。
每次隨機增加一條邊的時候一共有兩種情況:
1)這條邊連接了兩個不同的連通分量,它的概率是p
2)這條邊在一個連通分量里,它的概率是q = 1 - p
前者可以改變連通分量的數量,后者不能

如果把當前圖的狀態視為一個子問題
那么就可以用動態規劃解決問題了
圖的狀態可以表示為:有多少個連通分量,每個連通分量包含多少個點
比如說圖的狀態 (2, 3, 3) 表示有三個連通分量,每個連通分量包含的點的個數分別為 2, 3, 3

動態規劃的轉移方程為:
f = p*(1+r) + p*q*(2+r) + p*q^2*(3+r) ....
其中r為p發生后,新狀態的期望值
這個東西高中的時候學過,呵呵。

而1)中也包含多種情況,需要兩兩枚舉
最大的問題是,f的值是一個無限數列,它的極值很難求。但無論如何,有高手求出來了。。在這里:http://archive.cnblogs.com/a/1325929/
它的極值是 f = p * (1 / (1 - q) + r) / (1 - q)
我對照了一下標程,確實是這個。
后來我自己推導了一下,發現它可以化成多個等比數列相加的形式,求和后,發現當n趨向于無窮大的時候,它的極限就是上面這個公式。
(注意:i*q^i,  當0<q<1,i趨向于無窮大的時候等于0)

這樣程序就可以寫了。動態規劃保存每個圖的狀態。
如果用python寫,只要建立一個tuple到float的映射就可以了。非常方便。
java中也有List<int>到Double的映射。
c里面估計就得用hash了。

py代碼,參照標程寫的。


fi 
= open('in')
fo 
= open('out')
dp 
= {():0}
ti 
= 0

def get(s):
    
if s in dp:
        
return dp[s]
    q 
= sum([i*(i-1for i in s])*1.0/2/nn
    res 
= 0
    
for i in range(len(s)):
        
for j in range(len(s)):
            
if i < j:
                l 
= list(s)
                
del l[max(i,j)]
                
del l[min(i,j)]
                l.append(s[i]
+s[j])
                l.sort()
                r 
= get(tuple(l))
                p 
= s[i]*s[j]*1.0/nn
                res 
+= p*(1+r-r*q)/pow(1-q,2)
    dp[s] 
= res
    
return res

while 1:
    a 
= fi.readline().split()
    
if a == None or len(a) != 2:
        
break
    N, M 
= int(a[0]), int(a[1])
    nn 
= N*(N-1)/2
    s 
= [ i for i in range(N) ]
    
for i in range(M):
        u, v 
= [ int(i) for i in fi.readline().split() ]
        u 
-= 1
        v 
-= 1
        k 
= s[u]
        
for j in range(N):
            
if s[j] == k:
                s[j] 
= s[v]
    ss 
= [ s.count(i) for i in set(s) ]
    ss.sort()
    
print '----', ti
    mine 
= get(tuple(ss))
    ans 
= float(fo.readline().strip())
    
print 'mine', mine, 'ans', ans
    
print len(dp)
    ti 
+= 1
    


標程
用很簡潔的代碼寫了并查集,值得借鑒!

import java.util.*;
import java.io.File;
import java.io.PrintWriter;
import java.io.FileNotFoundException;

public class interconnect_pm {

    
private static int nn;

    
public static void main(String[] args) throws FileNotFoundException {
        Scanner in 
= new Scanner(new File("in"));
        PrintWriter out 
= new PrintWriter("ans.out");
        
int n = in.nextInt();
        nn 
= (n * (n - 1)) / 2;
        
int m = in.nextInt();
        
int[] p = new int[n];
        
for (int i = 0; i < n; i++) p[i] = i;
        
for (int i = 0; i < m; i++) {
            
int u = in.nextInt();
            
int v = in.nextInt();
            u
--;
            v
--;
            
int k = p[u];
            
for (int j = 0; j < n; j++) {
                
if (p[j] == k) {
                    p[j] 
= p[v];
                }
            }
        }
        List
<Integer> st = new ArrayList<Integer>();
        
for (int i = 0; i < n; i++) {
            
int s = 0;
            
for (int j = 0; j < n; j++) {
                
if (p[j] == i) s++;
            }
            
if (s > 0) {
                st.add(s);
            }
        }
        Collections.sort(st);
        List
<Integer> fn = new ArrayList<Integer>();
        fn.add(n);
        mem.put(fn, 
0.0);
        out.println(get(st));
        System.out.println(mem.size());
        out.close();
    }

    
static Map<List<Integer>, Double> mem = new HashMap<List<Integer>, Double>();

    
private static double get(List<Integer> st) {
        Double ret 
= mem.get(st);
        
if (ret != nullreturn ret;
        
int m = st.size();
        
int[][] a = new int[m][m];
        
for (int i = 0; i < m; i++) {
            
for (int j = i + 1; j < m; j++) {
                a[i][j] 
= st.get(i) * st.get(j);
            }
        }
        
int s = 0;
        
for (int i = 0; i < m; i++) {
            s 
+= st.get(i) * (st.get(i) - 1/ 2;
        }
        
double res = 0;
        
for (int i = 0; i < m; i++) {
            
for (int j = i + 1; j < m; j++) {
                List
<Integer> ss = new ArrayList<Integer>(st.size() - 1);
                
boolean q = true;
                
int z = st.get(i) + st.get(j);
                
for (int k = 0; k < m; k++) {
                    
if (k != i && k != j) {
                        
int zz = st.get(k);
                        
if (q && zz >= z) {
                            q 
= false;
                            ss.add(z);
                        }
                        ss.add(zz);
                    }
                }
                
if (q)
                    ss.add(z);
                
double p = a[i][j] * 1.0 / (nn - s);
                
double e = a[i][j] * 1.0 / ((1 - s * 1.0 / nn) * (1 - s * 1.0 / nn) * nn);
                e 
= e + get(ss) * p;
                res 
+= e;
            }
        }
        System.out.println(st);
        mem.put(st, res);
        
return res;
    }

}


posted on 2011-02-19 11:01 糯米 閱讀(661) 評論(0)  編輯 收藏 引用 所屬分類: POJ

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            一区二区免费看| 亚洲欧美国产不卡| 国产精品久久一区主播| 欧美成人免费观看| 欧美日韩精品久久| 国产精品日韩精品欧美在线| 国产乱码精品一区二区三区av| 国产欧美一区二区精品性色| 精品成人久久| 一区二区三区久久| 欧美伊人久久| 蜜月aⅴ免费一区二区三区| 亚洲第一久久影院| 亚洲毛片网站| 久久av一区| 欧美美女bbbb| 国产伦精品一区二区三区四区免费 | 国产一区美女| 欧美激情一区二区久久久| 欧美色视频日本高清在线观看| 国产精品乱码久久久久久| 狠狠狠色丁香婷婷综合激情| 亚洲另类在线视频| 欧美自拍偷拍午夜视频| 亚洲国产高清一区| 午夜精品99久久免费| 欧美成人久久| 国内成人精品2018免费看| 日韩视频三区| 久久九九有精品国产23| 亚洲精品免费在线| 久久亚洲一区| 国产乱肥老妇国产一区二| 亚洲乱码国产乱码精品精98午夜 | 久久久久久色| 国产精品日韩一区二区| 亚洲免费成人| 看片网站欧美日韩| 亚洲一区二区三区中文字幕| 欧美久久婷婷综合色| 红桃视频成人| 久久av资源网站| 一区二区三区四区国产| 欧美~级网站不卡| 激情亚洲一区二区三区四区| 欧美一区二区三区免费大片| 日韩写真在线| 欧美片第一页| 9久草视频在线视频精品| 欧美国产日韩一区二区在线观看 | 久色成人在线| 欧美在线3区| 国产亚洲欧美日韩日本| 午夜日本精品| 亚洲午夜国产成人av电影男同| 欧美激情国产精品| 亚洲精品久久久一区二区三区| 美女黄色成人网| 久久精品国产欧美亚洲人人爽| 国产精品一区久久| 久久riav二区三区| 欧美一区二区三区播放老司机| 国产精品亚洲综合一区在线观看| 亚洲免费视频在线观看| 在线天堂一区av电影| 欧美系列一区| 欧美一区二区三区在| 欧美一区二区三区男人的天堂| 国产日韩欧美日韩| 久久综合久久美利坚合众国| 久久视频免费观看| 久久激情五月激情| 亚洲国产天堂网精品网站| 久久综合久久综合这里只有精品| 黄色精品网站| 欧美国产精品一区| 欧美精品粉嫩高潮一区二区| 亚洲视频免费看| 亚洲欧美国产毛片在线| 国产一区二区三区四区在线观看| 玖玖在线精品| 欧美日本免费| 久久精品国产69国产精品亚洲 | 午夜视频精品| 亚洲二区三区四区| 亚洲美女中出| 国产丝袜美腿一区二区三区| 另类综合日韩欧美亚洲| 欧美激情按摩在线| 欧美一级一区| 欧美成人亚洲成人| 久久aⅴ乱码一区二区三区| 久久免费观看视频| 亚洲午夜精品福利| 久久久精品国产免大香伊| 99国产精品| 久久www免费人成看片高清| 亚洲美女黄色| 欧美一区二区三区婷婷月色| 亚洲精品一区在线观看| 性欧美1819sex性高清| 亚洲免费黄色| 久久国产精品亚洲va麻豆| av不卡在线看| 久久亚洲一区| 久久精品亚洲乱码伦伦中文| 欧美日韩 国产精品| 欧美成人午夜激情视频| 国产日韩成人精品| 亚洲最新在线视频| 亚洲精品系列| 狂野欧美激情性xxxx| 欧美专区在线| 国产精品视频福利| 日韩视频免费观看高清在线视频 | 99v久久综合狠狠综合久久| 国产综合香蕉五月婷在线| 亚洲美女性视频| 亚洲精品影院在线观看| 久久久av水蜜桃| 久久精品视频网| 国产精品你懂得| 一本大道久久a久久综合婷婷| 亚洲国产网站| 久久婷婷蜜乳一本欲蜜臀| 久久国产精品久久久| 国产精品对白刺激久久久| 亚洲国产欧美日韩精品| 亚洲大胆av| 久久亚洲国产成人| 久久欧美肥婆一二区| 欧美三级乱人伦电影| 国产精品剧情在线亚洲| 美女精品在线| 乱码第一页成人| 国产日韩在线播放| 先锋影音久久久| 欧美影院在线播放| 国产欧美精品一区二区色综合 | 久久久久九九九| 国产日韩在线不卡| 亚洲欧美综合v| 久久激情五月丁香伊人| 国产亚洲成人一区| 久久激情综合网| 美女91精品| 91久久久久久| 欧美日韩国产探花| 一区二区三区精品在线 | 欧美一级播放| 国产色产综合色产在线视频| 欧美一区二区三区电影在线观看| 久久精品99国产精品酒店日本| 国产日韩精品一区二区浪潮av| 午夜国产不卡在线观看视频| 久久人体大胆视频| 亚洲精品日韩在线观看| 欧美日韩一级片在线观看| 亚洲一区三区电影在线观看| 久久久久欧美| 亚洲伦理自拍| 国产精品嫩草99a| 久久综合婷婷| 亚洲作爱视频| 免费不卡中文字幕视频| 一片黄亚洲嫩模| 欧美主播一区二区三区| 国产精品久久久久久久久久久久| 一区二区国产日产| 欧美伊人久久| 亚洲国产另类久久精品| 国产精品v片在线观看不卡| 欧美一区二区三区播放老司机 | 黄色成人小视频| 欧美日本国产| 久久精品视频播放| 一区二区三区免费网站| 久久久人成影片一区二区三区| 亚洲人成毛片在线播放| 国产精品拍天天在线| 免费在线日韩av| 欧美一区二区精品在线| 亚洲另类自拍| 欧美18av| 欧美在线看片| 欧美午夜电影在线| 久久精品成人欧美大片古装| 亚洲丰满少妇videoshd| 亚洲欧美国产77777| 狠狠88综合久久久久综合网| 欧美日韩美女在线观看| 亚洲小少妇裸体bbw| 老司机成人在线视频| 99国产精品国产精品久久| 六十路精品视频| 久久久久久网| 欧美在线观看视频一区二区三区| 9色精品在线| 亚洲精品久久久久久一区二区| 国产午夜亚洲精品不卡|