zoukankan      html  css  js  c++  java
  • 2016湖南省省赛 B 有向无环图(树形dp)

    d[u]表示u到其他所有点的路径数*对应点的权值的和

     1 #define bug(x) cout<<#x<<" is "<<x<<endl
     2 #define IO std::ios::sync_with_stdio(0)
     3 #include <bits/stdc++.h>
     4 #define iter ::iterator
     5 #define pa pair<int,ll>
     6 #define pp pair<int,pa>
     7 using namespace  std;
     8 #define ll long long
     9 #define mk make_pair
    10 #define pb push_back
    11 #define se second
    12 #define fi first
    13 #define ls o<<1
    14 #define rs o<<1|1
    15 const ll mod=1e9+7;
    16 const int N=1e5+10;
    17 int n,m;
    18 vector<int>g[N];
    19 ll a[N],b[N],vis[N];
    20 ll d[N],in[N];
    21 void dfs(int u){
    22     if(vis[u])return;
    23     vis[u]=1;
    24     d[u]=0;
    25     for(auto v:g[u]){
    26         dfs(v);
    27         d[u]=(d[u]+d[v]+b[v])%mod;
    28     }
    29 }
    30 int main(){
    31     while(~scanf("%d%d",&n,&m)){
    32         for(int i=1;i<=n;i++){
    33             g[i].clear();
    34             in[i]=0;
    35             d[i]=0;
    36         }
    37         for(int i=1;i<=n;i++){
    38             scanf("%lld%lld",&a[i],&b[i]);
    39         }
    40         for(int i=1;i<=m;i++){
    41             int x,y;
    42             scanf("%d%d",&x,&y);
    43             in[y]++;
    44             g[x].pb(y);
    45         }
    46         for(int i=1;i<=n;i++){
    47             if(!in[i])dfs(i);
    48         }
    49         ll ans=0;
    50         for(int i=1;i<=n;i++){
    51             ans=(ans+a[i]*d[i]%mod)%mod;
    52         }
    53         printf("%lld
    ",ans);
    54     }
    55 }
  • 相关阅读:
    树的定义与存储
    软件测试概论二
    软件测试概论
    抽象数据类型
    java编程总结01---20190214
    java 按行读取本文文件并存放到mongodb中
    刷题感悟
    刷题感悟- Binary Tree Path Sum
    java io与nio
    java IO 学习笔记
  • 原文地址:https://www.cnblogs.com/ccsu-kid/p/11645248.html
Copyright © 2011-2022 走看看