pku1202 Family DAG图上的概率DP

pku1202 Family DAG图上的概率DP

题意:
给出N个怪物的家谱树,求M对怪物间的相关度。怪物可能一夫多妻或一妻多夫,也可以隔代交配。

给力条件:DAG

解法:
众所周知,DP有两种推理方法:第i个状态能推出哪些状态以及第i个状态可以由哪些状态得出,本题必须使用第二种方案
dp[pos][i],i=1..n为第pos个节点与其前趋(包括间接)节点间的相关度。
状态转移即为dp[pos][i]=sum(dp[p][i]*0.5),p为pos的直接前驱趋节点。
这题POJ好诡异,死都过不去,但是在小poj(poj.grids.cn),和zju上都没问题。可能将递归改成拓扑序上的迭代就可以了。不过我懒,不想动- -

代码:

 1 import  java.io. * ;
 2 import  java.util. * ;
 3 import  java.math. * ;
 4 public   class  Main  {
 5    static int nxt[][]=new int[305][305];
 6    static BigDecimal dp[][]=new BigDecimal[305][305],two=BigDecimal.ONE.add(BigDecimal.ONE);
 7    static int n=0,m=0;
 8    static boolean used[]=new boolean[305];
 9    static StreamTokenizer in=new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
10    static int nextInt() throws IOException
11    {
12        in.nextToken();
13        return (int)in.nval;
14    }

15    static void dfs(int pos)
16    {
17        if(used[pos]) return;
18        used[pos]=true;
19        
20        for(int j=0;j<2&&nxt[pos][j]!=-1;j++)
21        {
22            int p=nxt[pos][j];
23            dfs(p);
24            for(int i=1;i<=n;i++)  {dp[pos][i]=dp[pos][i].add(dp[p][i].divide(two));dp[i][pos]=dp[pos][i];}
25        }

26        dp[pos][pos]=BigDecimal.ONE;
27    }

28    public static void main(String[] args) throws IOException{
29        n=nextInt();
30         m=nextInt();
31        nxt=new int[n+1][2];
32        used=new boolean[n+1];
33        dp=new BigDecimal[n+1][n+1];
34        for(int i=1;i<=n;i++)
35        {
36            Arrays.fill(dp[i],BigDecimal.ZERO);
37            Arrays.fill(nxt[i],-1);
38        }

39        Arrays.fill(used, false);
40        for(int i=0;i<m;i++)
41        {
42            int a=nextInt(),b=nextInt(),c=nextInt();
43            nxt[a][0]=b;
44            nxt[a][1]=c;
45        }

46        for(int i=1;i<=n;i++)
47            dfs(i);
48       m=nextInt();
49       for(int i=0;i<m;i++)
50       {
51           int a=nextInt(),b=nextInt();
52          System.out.println(dp[a][b].multiply(new BigDecimal("100")).stripTrailingZeros().toPlainString()+"%");
53       }

54    }

55}

你可能感兴趣的:(pku1202 Family DAG图上的概率DP)