zoukankan      html  css  js  c++  java
  • Gym102174L 旅行的意义(期望dp)

    因为是dag,所以常规做法就是dfs,从出度为0的点不断返回

    我们设计f[i],表示从i开始到终点的期望天数

    刚开始到i需要一天,在i需要游玩一天,再游玩一天有(du[i]+1)的可能性,这是初始化的情况

    之后就是从他的后继节点更新过来。

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    typedef pair<int,int> pll;
    const int N=2e5+10;
    const ll mod=998244353;
    int h[N],ne[N],e[N],idx;
    int du[N];
    ll f[N];
    int n,m;
    int st[N];
    ll qpow(ll a,ll b){
        ll res=1;
        while(b){
            if(b&1){
                res=res*a%mod;
            }
            b>>=1;
            a=a*a%mod;
        }
        return res;
    }
    void add(int a,int b){
        e[idx]=b,ne[idx]=h[a],h[a]=idx++;
    }
    void dfs(int u){
        st[u]=1;
        f[u]=(2+qpow(du[u]+1,mod-2))%mod;
        if(u==1){
            f[u]=(f[u]-1+mod)%mod;
        }
        int i;
        for(i=h[u];i!=-1;i=ne[i]){
            int j=e[i];
            if(!st[j])
                dfs(j);
            f[u]=(f[u]+f[j]*qpow(du[u],mod-2))%mod;
        }
    }
    int main(){
        //ios::sync_with_stdio(false);
        int t;
        cin>>t;
        while(t--){
            idx=0;
            int i,j;
            scanf("%d%d",&n,&m);
            for(i=0;i<=n;i++){
                h[i]=-1;
                du[i]=0;
                f[i]=0;
                st[i]=0;
            }
            for(i=1;i<=m;i++){
                int a,b;
                scanf("%d%d",&a,&b);
                add(a,b);
                du[a]++;
            }
            dfs(1);
            printf("%lld
    ",f[1]%mod);
        }
    }
    View Code
    没有人不辛苦,只有人不喊疼
  • 相关阅读:
    c# 图像转化成灰度图
    文件操作 流
    GBK UTF8 GB2312 流
    助力奥巴马,拯救大气层
    ASP.NET 缓存技术
    GridView 和 ViewState 来实现条件查寻
    把日期按指定格式输出
    创业灵感淘宝网
    文件_上传_下载
    java23种设计模式与追MM
  • 原文地址:https://www.cnblogs.com/ctyakwf/p/13940098.html
Copyright © 2011-2022 走看看