30分,求助大佬
查看原帖
30分,求助大佬
71400
KGW_源楼主2020/9/22 21:39
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
#define maxn 300100
#define ll long long
#define clear(a) memset(a,0,sizeof a)

const ll MOD=1e9+7;
int n,m,tot,top,cnt,num;
ll ans1,ans2=1;
int first[maxn],w[maxn],dfn[maxn],low[maxn],st[maxn],id[maxn],min_val[maxn],same[maxn],ins[maxn];
struct edge{
    int nextx,to;
}e[maxn<<1];

void add(int u,int v){
    tot++;
    e[tot].nextx=first[u];
    first[u]=tot;
    e[tot].to=v;
}

void tarjan(int u){
    dfn[u]=low[u]=++cnt;
    st[++top]=u;
    ins[u]=1;
    for(int i=first[u];i;i=e[i].nextx){
        int v=e[i].to;
        if(!dfn[v]){
            tarjan(v);
            low[u]=min(low[u],low[v]);
        }
        else if(ins[v])
            low[u]=min(low[u],dfn[v]);
    }
    if(dfn[u]==low[u]){
        id[u]=++num;
        int minn=w[u];
        while(st[top]!=u){
            ins[st[top]]=0;
            id[st[top]]=num;
            top--;
            minn=min(minn,w[st[top]]);
        }
        top--;
        ins[u]=0;
        min_val[num]=minn;
    }
}

int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%d",&w[i]);
    scanf("%d",&m);
    for(int i=1;i<=m;i++){
        int a,b;
        scanf("%d%d",&a,&b);
        add(a,b);
    }
    for(int i=1;i<n;i++)
        if(!dfn[i])tarjan(i);
    
    for(int i=1;i<=n;i++)
        if(w[i]==min_val[id[i]])
            same[id[i]]++,same[id[i]]%=MOD;
    for(int i=1;i<=num;i++){
        ans1+=min_val[i];
        ans2*=(same[i]%MOD),ans2%=MOD;
    }
    printf("%d %d\n",ans1,ans2);
    return 0;
}

2020/9/22 21:39
加载中...