codeforces#244_div2_C Checkposts 强连通分量,Tarjan

来源:互联网 发布:免费下载涂涂乐软件 编辑:程序博客网 时间:2024/06/05 14:49

题目地址:cf#244_div2_C

额,每一个强连通分量里面放置一个police 

Tarjan模板,还没理解透彻,先用着吧。

然后只用计算每一个强连通分量里面,权值等于最小权值的有多少个,乘起来就可以了。

代码:

#include<iostream>#include<vector>#include<stack>#include<cstring>#include<cstdio>using namespace std;const int maxn=10000000;const long long mod=1000000007;//  scc Tarjan  模板vector<int>  G[maxn];int pre[maxn],lowlink[maxn],sccno[maxn],dfs_clock,scc_cnt;stack<int> S;void  dfs(int u ){    pre[u]=lowlink[u]=++dfs_clock;    S.push(u);        for(int i=0;i<G[u].size();i++)    {        int v=G[u][i];        if(!pre[v])        {            dfs(v);            lowlink[u]=min(lowlink[u],lowlink[v]);                    }        else if(!sccno[v])        {            lowlink[u]=min(lowlink[u],lowlink[v]);                    }    }            if(lowlink[u]==pre[u])    {        scc_cnt++;        for(;;)        {            int x=S.top();            S.pop();            sccno[x]=scc_cnt;            if(x==u)  break;        }    }}void  find_scc(int n){    dfs_clock=scc_cnt=0;    memset(sccno, 0, sizeof(sccno));    memset(pre, 0, sizeof(pre));    //memset(lowlink, 0, sizeof(lowlink));    for(int i=0;i<n;i++)    {        if(!pre[i])  dfs(i);    }}int p[100005];int minCost[100005];long long  minCnt[100005];int n,m;int main(){    cin>>n;    for(int i=0;i<n;i++)    {        scanf("%d",&p[i]);    }    cin>>m;    int a,b;        for(int i=0;i<m;i++)    {        scanf("%d%d",&a,&b);        G[a-1].push_back(b-1);    }        find_scc(n);        for(int i=0;i<n;i++)        sccno[i]--;        for(int i=0;i<scc_cnt;i++)    {        minCost[i]=mod;    }    for(int i=0;i<n;i++)    {        minCost[sccno[i]]=min(minCost[sccno[i]],p[i]);    }       for(int  i=0;i<n;i++)    {       if(p[i]==minCost[sccno[i]])       {           minCnt[sccno[i]]++;       }    }        long long  all_cost=0;    long long  ans=1;        for(int i=0;i<scc_cnt;i++)    {        all_cost+=minCost[i];        ans=(ans*minCnt[i])%mod;    }        cout<<all_cost<<' '<<ans<<endl;    }


0 0
原创粉丝点击