zoukankan      html  css  js  c++  java
  • csu 1804(有向无环图)

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int maxn=2e5+5;
    const int mod=1e9+7;
    
    /*
    	因为是有向的无环图,要找(i,j)之间的路径数,
    	肯定是考虑toposort就可以了
    	然后就是考虑怎么统计cnt(i,j)*a[i]*b[j]
    	如果cnt[i]表示到达i的种类,res[i]表示所有到达i点的cnt[*]*a[*]
    	的和,那么最后res[i]*b[i]就是最后的答案
    */
    
    int head[maxn],nxt[maxn],val[maxn];
    ll  res[maxn],tot;
    int a[maxn],b[maxn],deg[maxn];
    
    void init(){
    	tot=0;
    	memset(head,-1,sizeof(head));
    	memset(res,0,sizeof(val));
    	memset(deg,0,sizeof(deg));
    }
    
    void add(int u,int v){
    	val[tot]=v;
    	nxt[tot]=head[u];
    	head[u]=tot++;
    }
    int n,m,u,v;
    
    void solve(){
    	queue<int> q;
    	
    	for(int i=1;i<=n;i++)
    		if(!deg[i])q.push(i);
    	
    	while(!q.empty()){
    		u=q.front();q.pop();
    		for(int i=head[u];i!=-1;i=nxt[i]){
    			v=val[i];
    			res[v]=(res[v]+res[u]+a[u])%mod;
    			deg[v]--;
    			if(!deg[v])q.push(v);
    		}
    	}
    }
    
    int main(){
    	while(~scanf("%d%d",&n,&m)){
    		init();
    		for(int i=1;i<=n;i++)scanf("%d%d",a+i,b+i);
    		for(int i=0;i<m;i++){
    			scanf("%d%d",&u,&v);
    			add(u,v);
    			deg[v]++;
    		}
    		
    		solve();
    
    		ll ans=0;
    		for(int i=1;i<=n;i++)
    			ans=(ans+res[i]*b[i])%mod;
    		printf("%lld
    ",ans);
    	}
    	return 0;
    }
    

      

  • 相关阅读:
    Alpha冲刺总结
    测试随笔
    项目Alpha冲刺Day11
    项目Alpha冲刺Day12
    项目Alpha冲刺Day10
    项目Alpha冲刺Day9
    项目Alpha冲刺Day6
    beta冲刺1
    Beta准备博客
    基于微信小程序的实验室管理的postmortem
  • 原文地址:https://www.cnblogs.com/jihe/p/6677898.html
Copyright © 2011-2022 走看看