记录编号 46989 评测结果 AAAAAA
题目名称 血缘关系 最终得分 100
用户昵称 Gravatar王者自由 是否通过 通过
代码语言 C++ 运行时间 1.203 s
提交时间 2012-10-30 10:01:56 内存使用 116.16 MiB
显示代码纯文本
#include <cstdio>
#include <algorithm>
using namespace std;
const int N = 300 + 10;
class bign {
    public:
    int l, n[N];
    void clear() {
        l = 0;
        fill(n, n+N, 0);
    }
    void print() {
        if(n[0] == 1)
            printf("%d", 100);
        else {
            if(n[1]) printf("%d", n[1]);
            printf("%d", n[2]);
            if(l > 3) printf(".");
            for(int i=3; i<l; i++)
                printf("%d", n[i]);
        } printf("%c\n", '%');
    }
    void div() {
        int r = 0;
        for(int i=0; i<=l; i++) {
            r = r * 10 + n[i];
            n[i] = (r >> 1);
            r &= 1;
        } if(n[l]) l++;
    }
    void plus(bign b) {
        l = max(l, b.l);
        for(int i=l-1; i>=0; i--) {
            n[i] += b.n[i];
            if(n[i] > 9) n[i] %= 10, n[i-1]++;
        } while(l > 3 && !n[l-1]) l--;
    }
} p[N][N], t;
int f[N][2];
bool l[N][N], g[N][N] = {0};
void DFS(int x, int y) {
    if(l[x][y]) return;
    p[x][y].clear();
    if(x == y) {
        p[x][y].l = 1, p[x][y].n[0] = 1;
    } else if(!g[x][y] && f[x][0] > 0) {
        int a = f[x][0], b = f[x][1];
        DFS(a, y); DFS(b, y);
        t = p[a][y]; t.div(); p[x][y].plus(t);
        t = p[b][y]; t.div(); p[x][y].plus(t);
    } else if(!g[y][x] && f[y][0] > 0) {
        int a = f[y][0], b = f[y][1];
        DFS(x, a); DFS(x, b);
        t = p[x][a]; t.div(); p[x][y].plus(t);
        t = p[x][b]; t.div(); p[x][y].plus(t);
    } p[y][x] = p[x][y];
    l[x][y] = l[y][x] = 1;
}
int main() {
    freopen("kankei.in", "r", stdin);
    freopen("kankei.out", "w", stdout);
    int n, m, t, a, x, y;
    scanf("%d %d", &n, &m);
    for(int i=0; i<m; i++) {
        scanf("%d %d %d", &a, &x, &y);
        f[a][0] = x, f[a][1] = y;
        g[x][a] = g[y][a] = 1;
    }
    for(int k=1; k<=n; k++)
        for(int i=1; i<=n; i++)
            for(int j=1; j<=n; j++)
                g[i][j] = g[i][j] || g[i][k] & g[k][j];
    scanf("%d", &t);
    for(int i=0; i<t; i++) {
        scanf("%d %d", &x, &y);
        DFS(x, y);
        p[x][y].print();
    }
    return 0;
}