• 【luogu2194】HXY烧情侣 [tarjan 缩点]


    2194 HXY烧情侣

    emmmmm快乐水题

    由题可得 要用tarjan缩点 然后因为要求其中最小花费的方案数 用一个vector来记录该强连通分量内的情况 然后用乘法原理

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define ll long long
     4 const int N=100000+5,M=300000+5,inf=0x3f3f3f3f,mod=1e9+7;
     5 int n,m,w[N],S,p,ans1=0,ans2=1;
     6 int idx=0,Bcnt=0,dfn[N],low[N],bl[N],size[N];
     7 vector<int>inB[N];
     8 stack<int>s;
     9 bool inst[N];
    10 template<class t>void rd(t &x){
    11     x=0;int w=0;char ch=0;
    12     while(!isdigit(ch)) w|=ch=='-',ch=getchar();
    13     while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
    14     x=w?-x:x;
    15 }
    16 
    17 int head[N],tot=0;
    18 struct edge{int u,v,nxt;}e[M];
    19 void add(int u,int v){
    20     e[++tot]=(edge){u,v,head[u]};head[u]=tot;
    21 }
    22 
    23 
    24 void tarjan(int u){
    25     dfn[u]=low[u]=++idx;
    26     inst[u]=1,s.push(u);
    27     for(int i=head[u],v;i;i=e[i].nxt){
    28         v=e[i].v;
    29         if(!dfn[v]) tarjan(v),low[u]=min(low[u],low[v]);
    30         else if(inst[v]&&dfn[v]<low[u]) low[u]=dfn[v];
    31     }
    32     if(dfn[u]==low[u]){
    33         ++Bcnt;
    34         int v;
    35         do{
    36             v=s.top();s.pop();
    37             bl[v]=Bcnt,++size[Bcnt],inB[Bcnt].push_back(v),inst[v]=0;
    38         }while(u!=v);
    39     }
    40 }
    41 
    42 int main(){
    43     //freopen("in.txt","r",stdin);
    44     rd(n);
    45     for(int i=1;i<=n;++i) rd(w[i]);
    46     rd(m);
    47     for(int i=1,u,v;i<=m;++i) rd(u),rd(v),add(u,v);
    48     memset(dfn,0,sizeof(dfn));
    49     for(int i=1;i<=n;++i)
    50     if(!dfn[i]) tarjan(i);
    51     for(int i=1;i<=Bcnt;++i){
    52         int mn=inf,cnt;
    53         for(int j=1;j<=size[i];++j){
    54             if(mn>w[inB[i].back()]) mn=w[inB[i].back()],cnt=1;
    55             else if(mn==w[inB[i].back()]) ++cnt;
    56             inB[i].pop_back();
    57         }
    58         ans1+=mn;
    59         ans2=((ans2%mod)*cnt)%mod;
    60     }
    61     printf("%d %d",ans1,ans2);
    62     return 0;
    63 }
  • 相关阅读:
    C++ 11 lambda
    Win环境下的文件读写
    基于 Jenkins+Docker+Git 的CI流程初探
    python切片操作
    k8s 集群中的etcd故障解决
    Git 版本控制管理(二)
    Git 版本控制管理(一)
    Harbor 企业级镜像仓库搭建
    docker 数据管理
    docker 网络的几种模式
  • 原文地址:https://www.cnblogs.com/lxyyyy/p/11158196.html
Copyright © 2020-2023  润新知