CSU

来源:互联网 发布:韩版note8网络制式 编辑:程序博客网 时间:2024/04/30 18:38

题目链接:

http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1804

题解:

用拓扑的思想去进行转移 ,值得注意的是,这里的单个cout一直恒定为1,多个的话,可以使用加法的组合定理。

代码:

#include <cstdio>#include <vector>#include <queue>#include <cstring>#include <iostream>#include <algorithm>using namespace std;#define met(a,b) memset(a,b,sizeof(a))#define inf 0x3f3f3f3ftypedef long long ll;const ll mod = 1e9+7;const int maxn = 1e5+10;vector<int> list[maxn];int indegree[maxn];queue<int>q;ll a[maxn];ll b[maxn];int main(){    int n,m;    while(scanf("%d%d",&n,&m)!=EOF)    {        while(!q.empty())            q.pop();        for(int i=0;i<=n;i++)            list[i].clear();        met(indegree,0);        for(int i=1;i<=n;i++)            scanf("%lld%lld",&a[i],&b[i]);        for(int i=0;i<m;i++)        {            int  u,v;            scanf("%d%d",&u,&v);            list[u].push_back(v);            indegree[v]++;        }        for(int i=1;i<=n;i++)        {            if(indegree[i]==0)                q.push(i);        }        ll ans=0;        while(!q.empty())        {            int u=q.front();            q.pop();            for(int i=0;i<list[u].size();i++)            {                int v=list[u][i];                ans=(ans+(a[u]*b[v])%mod)%mod;                //printf("%lld\n",ans);                a[v]=(a[v]+a[u])%mod;                indegree[v]--;                if(indegree[v]==0)                {                    q.push(v);                }            }        }        printf("%lld\n",ans);    }}
0 0
原创粉丝点击