zoukankan      html  css  js  c++  java
  • hdu4035 Maze

    题目链接

    hdu4035 Maze

    题解

    f[u]表示在节点u通关的所需的边数期望
    转移方程分叶子节点和非叶子点讨论
    发现都可以化成f[x]=af[1]+bf[dad]+c的形式
    然后推一下系数
    还是看这个吧https://www.cnblogs.com/Paul-Guderian/p/7624039.html

    代码

    #include<cmath> 
    #include<cstdio> 
    #include<ctime> 
    #include<cstring> 
    #include<algorithm> 
    inline int read() { 
        int x = 0,f = 1; 
        char c = getchar(); 
        while(c < '0' || c > '9')c = getchar(); 
        while(c <= '9' && c >= '0') x = x * 10 + c - '0',c = getchar(); 
        return x * f; 
    }
    #define eps 1e-9
    const int maxn = 100007; 
    struct node {
        int v,next; 
    } edge[maxn << 1]; 
    int head[maxn],num = 0; 
    inline void add_edge(int u,int v) { 
        edge[++ num].v = v; edge[num].next = head[u]; head[u] = num; 
    } 
    int n; 
    int a[maxn]; 
    double A[maxn],B[maxn],C[maxn]; 
    double k[maxn],e[maxn]; 
    bool dfs(int x,int fa) { 
        if(!edge[head[x]].next && x != 1) { 
            A[x] = k[x]; 
            B[x] = 1 - k[x] - e[x]; 
            C[x] = 1 - k[x] - e[x]; 
            return true; 
        } 
        double A_ = 0,B_ = 0,C_ = 0; int cnt = 0; 
        for(int i = head[x];i;i = edge[i].next) { 
            int v = edge[i].v; 
            if(++ cnt && v != fa) { 
                if(!dfs(v,x)) return false; 
                A_ += A[v];B_ += B[v],C_ += C[v]; 
            } 
        } 
        if(fabs(1 - (1 - k[x] - e[x]) / cnt * B_) < eps) return false ; 
        A[x] = (k[x] + (1 - k[x] - e[x]) / cnt * A_ ) / (1 - (1 - k[x] - e[x]) / cnt * B_); 
        B[x] = ((1 - k[x] - e[x]) / cnt) / (1 - (1 - k[x] - e[x]) / cnt * B_); 
        C[x] = (1 - k[x] - e[x] + (1 - k[x] - e[x]) / cnt * C_) / (1 - (1 - k[x] - e[x]) / cnt * B_); 
        return true; 
    }  
    int main() { 
        int Q = read(); 
        for(int t = 1;t <= Q;t += 1) { 
            memset(head,0,sizeof head); 
            num = 0; 
            n = read(); 
            for(int i = 1;i < n;++ i) { 
                int u = read(),v = read(); 
                add_edge(u,v);add_edge(v,u); 
            } 
            for(int i = 1;i <= n;++ i) { 
                scanf("%lf%lf",&k[i],&e[i]); 
                k[i] /= 100,e[i] /= 100; 
            } 
            printf("Case %d : ",t); 
            if(!dfs(1,1) || fabs(1 - A[1]) < eps) { 
                puts("impossible"); continue; 
            } else printf("%.6lf
    ",C[1] / (1 - A[1])); 
        } 
    }
    
  • 相关阅读:
    组件ListWidget 继承StatefulWidget后动态传入List数据,组件并不会重新渲染。
    Spring Security 采用httpBasic模式认证
    基于Vue2.0实现OpenLayers MarkerCluster海量聚合点标记
    Spring Security 采用formLogin模式认证
    配置页面兼容360浏览器
    如何进行企业工作流选型
    IT项目管理的六种错误思维
    时间管理10项技巧
    一个项目涉及到的50个Sql语句(下)
    SQL Server2000存储过程调试
  • 原文地址:https://www.cnblogs.com/sssy/p/9643322.html
Copyright © 2011-2022 走看看