日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

LuoGu P2002 消息扩散

發布時間:2023/12/10 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LuoGu P2002 消息扩散 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目傳送門
這個題其實就是tarjan縮點的板子題對吧....至少我是這么想的
首先這是個有向圖,對于一個有向圖,我們肯定要考慮環的存在與否,恰好這個題又是讓我們找出最少的點,使得這幾個點能夠走遍全圖
那么,顯然,對于每一個強連通分量,我們看做一個點即可(因為強連通分量中每兩個點之間一定能從一個點到另一個點,即從一個點出發一定能夠走遍整個強連通分量)
縮完點之后,我們得到一個DAG,顯然,對于每一個入度為零的點,我們都需要發布消息,其余入度不為零的點都可以通過這些入度為零的點走到
于是,這題就A了

#include <iostream> #include <cstdlib> #include <cstdio>using namespace std;const int N=1e5+5; const int M=5e5+5;struct edge{int to,next; }e[M];int n,m,dfn[N],low[N],cnt,head[N]; int idx[N],s[N],top,tot,sum; bool ins[N];int ind[N],ans;inline void build(int u,int v){e[++tot].next=head[u];head[u]=tot;e[tot].to=v;return ; }inline void tarjan(int cur){s[++top]=cur;ins[cur]=true;dfn[cur]=low[cur]=++cnt;for(int i=head[cur];i;i=e[i].next){int k=e[i].to;if(!dfn[k]){tarjan(k);low[cur]=min(low[cur],low[k]);}else if(ins[k]) low[cur]=min(low[cur],dfn[k]);}if(low[cur]==dfn[cur]){++sum;while(s[top+1]!=cur){idx[s[top]]=sum;ins[s[top--]]=false;}}return ; }int main(){scanf("%d%d",&n,&m);for(int i=1;i<=m;++i){register int u,v;scanf("%d%d",&u,&v);build(u,v);}for(int i=1;i<=n;++i) if(!dfn[i]) tarjan(i);for(int i=1;i<=n;++i)for(int j=head[i];j;j=e[j].next){int k=e[j].to;if(idx[i]!=idx[k]) ++ind[idx[k]];}for(int i=1;i<=sum;++i) if(!ind[i]) ++ans;printf("%d\n",ans);return 0; }

轉載于:https://www.cnblogs.com/Equinox-Flower/p/9648558.html

總結

以上是生活随笔為你收集整理的LuoGu P2002 消息扩散的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。