2014-team6/java

从 Trac 迁移的文章

这是从旧校内 Wiki 迁移的文章,可能存在一些样式问题,您可以向 memset0 反馈。

原文章内容如下:

=== st0rm23 ===
{{{
import java.math.BigDecimal;
import java.util.Arrays;
import java.util.Scanner;


public class Main {
    int MAXN = 1000;
    int n, m;
    int[] fa, ma;
    int[][] vis;
    BigDecimal[][] ff;
    int[] dep;
    BigDecimal ans;
    BigDecimal fact;

    void init()
    {
        fa = new int[MAXN];
        Arrays.fill(fa, -1);
        ma = new int[MAXN];
        Arrays.fill(ma, -1);
        vis = new int[MAXN][MAXN];
        ff = new BigDecimal[MAXN][MAXN];
        dep = new int[MAXN];
        Arrays.fill(dep, -1);
        fact = BigDecimal.valueOf(0.5);
    }

    BigDecimal rp(int a, int b)
    {
        if (1 == vis[a][b]) return ff[a][b];
        if (a == b) return BigDecimal.valueOf(1);
        if (fa[a] == -1 && fa[b] == -1) return BigDecimal.valueOf(0);

        if (dep[a] > dep[b]) 
        {
            int tmp = a;
            a = b;
            b = tmp;
        }
        BigDecimal tmp1 = rp(a, fa[b]);
        BigDecimal tmp2 = rp(a, ma[b]);
        tmp1 = tmp1.multiply(fact);
        tmp2 = tmp2.multiply(fact);
        BigDecimal ans = tmp1.add(tmp2);
        ff[a][b] = ans;
        ff[b][a] = ans;
        vis[a][b] = 1;
        vis[b][a] = 1;
        return ans;
    }

    void findDep(int i)
    {
        if (dep[i] != -1) return;
        if (fa[i] == -1)
        {
            dep[i] = 1;
            return;
        }
        findDep(fa[i]);
        findDep(ma[i]);
        if (dep[fa[i]] > dep[ma[i]]) dep[i] = dep[fa[i]] + 1;
        else dep[i] = dep[ma[i]] + 1;
    }

    void work()
    {
        boolean flag = false;
        Scanner cin = new Scanner(System.in);
        while (cin.hasNext())
        {
            init();
            n = cin.nextInt();
            m = cin.nextInt();
            if (flag) System.out.println();
            for (int i=0; i<m; i++)
            {
                int a, b, c;
                a = cin.nextInt();
                b = cin.nextInt();
                c = cin.nextInt();
                fa[a] = b;
                ma[a] = c;
            }

            for (int i=1; i<=n; i++) findDep(i);

            int t;
            t = cin.nextInt();
            for (int i=0; i<t; i++)
            {
                int a, b;
                a = cin.nextInt();
                b = cin.nextInt();
                ans = rp(a, b);             



                String s = ans.movePointRight(2).toPlainString();
                if (s.indexOf('.') != -1) {
                int l = s.length() -1;
                while (s.charAt(l) == '0') 
                {
                    --l;
                }
                if (s.charAt(l) != '.') {
                    ++l;
                }
                s = s.substring(0, l);
                }
                System.out.print(s);
                System.out.println("%");
            }
            flag = true;
        }
    }

    public static void main(String args[])
    {
        //System.out.print("sb");
        Main main = new Main();
        main.work();
    }
}




}}}

st0rm23

import java.math.BigDecimal;
import java.util.Arrays;
import java.util.Scanner;
public class Main {
    int MAXN = 1000;
    int n, m;
    int[] fa, ma;
    int[][] vis;
    BigDecimal[][] ff;
    int[] dep;
    BigDecimal ans;
    BigDecimal fact;
    void init()
    {
        fa = new int[MAXN];
        Arrays.fill(fa, -1);
        ma = new int[MAXN];
        Arrays.fill(ma, -1);
        vis = new int[MAXN][MAXN];
        ff = new BigDecimal[MAXN][MAXN];
        dep = new int[MAXN];
        Arrays.fill(dep, -1);
        fact = BigDecimal.valueOf(0.5);
    }
    BigDecimal rp(int a, int b)
    {
        if (1 == vis[a][b]) return ff[a][b];
        if (a == b) return BigDecimal.valueOf(1);
        if (fa[a] == -1 && fa[b] == -1) return BigDecimal.valueOf(0);
        if (dep[a] > dep[b]) 
        {
            int tmp = a;
            a = b;
            b = tmp;
        }
        BigDecimal tmp1 = rp(a, fa[b]);
        BigDecimal tmp2 = rp(a, ma[b]);
        tmp1 = tmp1.multiply(fact);
        tmp2 = tmp2.multiply(fact);
        BigDecimal ans = tmp1.add(tmp2);
        ff[a][b] = ans;
        ff[b][a] = ans;
        vis[a][b] = 1;
        vis[b][a] = 1;
        return ans;
    }
    void findDep(int i)
    {
        if (dep[i] != -1) return;
        if (fa[i] == -1)
        {
            dep[i] = 1;
            return;
        }
        findDep(fa[i]);
        findDep(ma[i]);
        if (dep[fa[i]] > dep[ma[i]]) dep[i] = dep[fa[i]] + 1;
        else dep[i] = dep[ma[i]] + 1;
    }
    void work()
    {
        boolean flag = false;
        Scanner cin = new Scanner(System.in);
        while (cin.hasNext())
        {
            init();
            n = cin.nextInt();
            m = cin.nextInt();
            if (flag) System.out.println();
            for (int i=0; i<m; i++)
            {
                int a, b, c;
                a = cin.nextInt();
                b = cin.nextInt();
                c = cin.nextInt();
                fa[a] = b;
                ma[a] = c;
            }
            for (int i=1; i<=n; i++) findDep(i);
            int t;
            t = cin.nextInt();
            for (int i=0; i<t; i++)
            {
                int a, b;
                a = cin.nextInt();
                b = cin.nextInt();
                ans = rp(a, b);             
                String s = ans.movePointRight(2).toPlainString();
                if (s.indexOf('.') != -1) {
                int l = s.length() -1;
                while (s.charAt(l) == '0') 
                {
                    --l;
                }
                if (s.charAt(l) != '.') {
                    ++l;
                }
                s = s.substring(0, l);
                }
                System.out.print(s);
                System.out.println("%");
            }
            flag = true;
        }
    }
    public static void main(String args[])
    {
        //System.out.print("sb");
        Main main = new Main();
        main.work();
    }
}