zoukankan      html  css  js  c++  java
  • 【CF1027D】Mouse Hunt(拓扑排序,环)

    题意:给定n个房间,有一只老鼠可能从其中的任意一个出现,

    在第i个房间设置捕鼠夹的代价是a[i],若老鼠当前在i号房间则下一秒会移动到b[i]号,

    问一定能抓住老鼠的最小的总代价

    n<=2e5,a[i]<=1e4

    思路:tarjan缩点(环)之后找到所有出度为0的分量,找到分量中最小的a[i],将a[i]加到ans中

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<string>
     4 #include<cmath>
     5 #include<iostream>
     6 #include<algorithm>
     7 #include<map>
     8 #include<set>
     9 #include<queue>
    10 #include<vector>
    11 #include<bitset>
    12 using namespace std;
    13 typedef long long ll;
    14 typedef unsigned int uint;
    15 typedef unsigned long long ull;
    16 typedef pair<int,int> PII;
    17 typedef vector<int> VI;
    18 #define fi first
    19 #define se second 
    20 #define MP make_pair
    21 #define N      210000
    22 #define M      51
    23 #define MOD 1000000007
    24 #define eps 1e-8 
    25 #define pi     acos(-1)
    26 #define oo     1e9
    27 
    28 int flag[N],dfn[N],low[N],a[N],b[N],s[N],f[N],stk[N],oud[N],top,tim,id;
    29 vector<int>c[N];
    30 
    31 void dfs(int u)
    32 {
    33     flag[u]=1;
    34     stk[++top]=u;
    35     dfn[u]=low[u]=++tim;
    36     for(int i=0;i<=(int)c[u].size()-1;i++)
    37     {
    38         int v=c[u][i];
    39         if(!flag[v])
    40         {
    41             dfs(v);
    42             low[u]=min(low[u],low[v]);
    43         }
    44          else if(!s[v]) low[u]=min(low[u],low[v]);
    45     }
    46     if(low[u]==dfn[u])
    47     {
    48         id++;
    49         while(stk[top]!=u) 
    50         {
    51             s[stk[top]]=id;
    52             top--;
    53         }
    54         s[stk[top]]=id;
    55         top--;
    56     }
    57 }
    58 
    59 int main()
    60 {
    61     int n;
    62     scanf("%d",&n);
    63     id=0;
    64     for(int i=1;i<=n;i++) scanf("%d",&a[i]);
    65     for(int i=1;i<=n;i++)
    66     {
    67         scanf("%d",&b[i]);
    68         c[i].push_back(b[i]);
    69     }
    70     tim=0;
    71     for(int i=1;i<=n;i++)
    72      if(!flag[i]) dfs(i);
    73     int ans=0;
    74     for(int i=1;i<=id;i++) f[i]=oo;
    75     for(int i=1;i<=n;i++) f[s[i]]=min(f[s[i]],a[i]);
    76     for(int i=1;i<=n;i++) if(s[i]!=s[b[i]]) oud[s[i]]++;
    77     for(int i=1;i<=id;i++)
    78      if(!oud[i]) ans+=f[i];
    79     printf("%d
    ",ans); 
    80     return 0;
    81 }
  • 相关阅读:
    常见自动化场景处理
    等待设置的三种方法
    selenium-浏览器操作
    一个 tomcat 下如何部署多个项目?附详细步骤
    Python篇:测试小白也能懂的常用加密算法解析
    如何高效开展测试用例评审?附用例评审检查清单及用例评审报告模板
    手机大厂必备测试技能-GMS 认证
    Python自动化 让接口数据秒变 python 代码
    Python自动化 谈谈 cookies
    Python自动化 作为代码小白,我是这样成为自动化大神的!
  • 原文地址:https://www.cnblogs.com/myx12345/p/10102759.html
Copyright © 2011-2022 走看看