首页 > 其他分享 >luogu P4819 [中山市选] 杀人游戏 题解 【强连通分量+缩点】

luogu P4819 [中山市选] 杀人游戏 题解 【强连通分量+缩点】

时间:2023-09-27 16:14:52浏览次数:35  
标签:缩点 sta int 题解 top vis dfn low luogu

目录

题目链接

P4819

思路分析

首先考虑这道题的连通性。容易发现这种类型的题目会容易产生环形的状态转移。假设我们知道了其中的一个点是否是黑白点,那么我们就可以知道所有点是否是黑白点。容易陷入一个误区:我们只能通过一个点知道他所相邻的最直接的点,如何确定相邻的点的状态?注意本题求的是存活且找到黑点的概率而不是期望一类,我们只需要能在黑点前停下就可以了。注意 tarjan强连通分量的一个重要性质:避免重边!虽然我之前做的题没有刻意卡这个性质。

代码

#include<iostream>
#include<cstdio>
#include<vector>
#include<iomanip>
using namespace std ;
const int N = 1e5+10 ;
const int M = 3e5+10 ;
int n ,m ;
vector<int> edge[N] ;
int low[N] ,dfn[N] ,tim ,sta[N] ,top ,col[N] ,cnt ;
bool vis[N] ;
inline void tarjan(int u){
    sta[++top] = u ;
    vis[u] = 1 ;
    low[u] = dfn[u] = ++tim ;
    for(int v : edge[u]){
        if(!dfn[v]){
            tarjan(v) ;
            low[u] = min(low[u] , low[v]) ;
        }else if(vis[v])    low[u] = min(low[u] , dfn[v]) ;
    }
    if(low[u] == dfn[u]){
        col[u] = ++cnt ;
        while(sta[top] != u)    col[sta[top]] = cnt ,vis[sta[top--]] = 0 ;
        vis[u] = 0 ,top-- ;
    }
}
int in[N] ,siz[N] ,tot ;
vector<int> g[N] ;
bool vise[M] ;
int main(){
    ios::sync_with_stdio(0) ,cin.tie(0) ,cout.tie(0) ;
    cin >> n >> m ;
    for(int i = 1,u,v;i <= m;++i){cin >> u >> v ;edge[u].push_back(v) ;}
    for(int i = 1;i <= n;++i)    if(!dfn[i]) tarjan(i) ;
    for(int i = 1;i <= n;++i)   siz[col[i]]++ ;
    for(int i = 1;i <= n;++i){
        for(int j : edge[i]){
            if(col[i] == col[j] || vise[col[j]]) continue ;
            g[col[i]].push_back(col[j]) ;
            vise[col[j]] = 1 ;in[col[j]]++ ;
        }
        for(int j : edge[i])    vise[col[j]] = 0 ;
    }
    bool flag = 1 ;
    for(int i = 1;i <= cnt;++i){
        if(!in[i])  tot++ ;
        if(in[i] || siz[i] > 1) continue ;
        if(flag == 0)   continue ;
        bool pp = 1 ;
        for(int j : g[i])
            if(in[j] <= 1){
                pp = 0 ;
                break ;
            }
        if(pp) tot-- ,flag = 0 ;
    }
    cout << fixed << setprecision(6) << 1.0 * (n - tot) / n ;
    return 0 ;
}

标签:缩点,sta,int,题解,top,vis,dfn,low,luogu
From: https://www.cnblogs.com/adolf-stalin/p/17732917.html

相关文章

  • CF1878 A-G 题解
    前言赛时代码可能比较难看。A判定\(a\)中是否有\(k\)即可。赛时代码B奇怪的构造题。令\(a_1=1,a_2=3\),其他项由上一项加一开始枚举判定可行性即可,可以简单证明时间复杂度为\(O(n)\)。赛时代码C容易发现当\(x\in\left[\dfrac{k(k+1)}{2},\dfrac{k(2n-k+1)}{2}\ri......
  • 【UVA 536】Tree Recovery 题解(根据遍历序列还原二叉树)
    小瓦伦丁非常喜欢玩二叉树。她最喜欢的游戏是随机构建查找节点中带有大写字母的二叉树。这是她创作的一个例子:为了给后代记录她的树,她为每棵树写下了两个字符串:预订单遍历(根、左子树、右子树)和有序遍历(左子树、根、右子树。对于上面绘制的树,预序遍历是DBACEGF,有序遍历是ABCDEFG......
  • Codeforces Round 742 Div2 A-D题解
    CodeforcesRound742Div2A-D题解A.DominoDisaster这题就是说给出一些2x1tile,然后给出2xn的第一行构造,问第二行这个刚开始想着是啥dp,一看那么多人过了果断改思路,发现这题就是个模拟题,就是把U换成D,D换成U,L和R不影响,然后输出就行了代码#include<bits/stdc++.h>using......
  • P6411 [COCI2008-2009#3] MATRICA 题解
    水题。发现根据限制\(M_{i,j}=M_{j,i}\)可以知道除了主对角线上的点,其他的点都是成对出现的。也就是说如果有一条要求的\(a_i\)为奇数,那么至少有一个\(c_i\)在主对角线上。记\(S=\sum\limits_{i=1}^{k}(a_i\equiv1\pmod2)\),即有\(S\)个要求中\(a_i\)为奇数。主对......
  • IDEA中的java代码Getters和Setters报红问题解决办法【杭州多测师_王sir】
    今天在新的编辑器中导入新项目时,发现很多get、set、toString的相关方法全部报红,仔细排查发现,原来是bean中注解采用lombok来自动生成get、set、toStirng、equals等方法,而新的编辑器未安装lombok plugin,所以全部报红。Lombok简介项目中经常使用bean,entity等类,绝大部分数据类类中都......
  • 2023.09.26 联考总结&题解
    T1derby你考虑直接贪心进行匹配即可,就是说对于每一个\(1\)去匹配最大的\(0\)#include<bits/stdc++.h>usingnamespacestd;intn,m;vector<int>A[2],B[2];intmain(){ freopen("derby.in","r",stdin); freopen("derby.out","w",s......
  • P6344 [CCO2017] Vera 与现代艺术 题解
    在\(V\timesV\)的平面上,\(n\)次修改,每次给定\(x,y,v\),令\(a,b\)为不超过\(x,y\)的最大的\(2\)的整数次幂,则所有\((x+pa,y+qb)(p,q为自然数)\)都加上\(v\),最后有\(m\)次单点询问一个位置的值。\(1\lex,y,V\le10^{18},1\lev,n,m\le2\times10^5\)我们可以......
  • P9566 [SDCPC2023] K-Difficult Constructive Problem 题解
    @目录DescriptionSolutionSol1Code1Sol2Code2Description有一个长度为\(n\)的01字符串\(s\),其中部分位置已给出,在?的位置处需填入一个1或0。一个填充方案是好的,当且仅当存在\(m\)个不同的\(i\)满足\(1\lei<n\)且\(s_i\nes_{i+1}\)。求所有好的填充方案中字典......
  • 预训练Bert模型输出类型为str问题解决
     input_ids=keras.layers.Input(shape=(MAXLEN,),dtype='int32')attention_mask=keras.layers.Input(shape=(MAXLEN,),dtype='int32')token_type_ids=keras.layers.Input(shape=(MAXLEN,),dtype='int32')_,x=bert_model([input_ids,atten......
  • Luogu9157「GLR-R4」夏至
    抢到最优解了,UOJ校验码上80pts过不去。/kk这里是官方题解的简化。首先考虑\(n=1\)怎么做,相当于对\(m\le10^{10}\)筛出\(f\)的前缀和。由于\(f(p)=p\),直接构造函数\(g(n)=n\)然后PN筛\(O(\sqrtm)\)求即可。然后考虑\(n>1\),由于\(n\)比较小,考虑对每一个\(i......