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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

[中山市选]杀人游戏 (Tarjan缩点)

發布時間:2025/3/15 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [中山市选]杀人游戏 (Tarjan缩点) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目鏈接

Solution

可以考慮到如果知道環內一點的身份,如果兇手在其中就查出來了,同時不會有危險.
那么對警察造成威脅的就是那些身份不明且不能從其他點轉移過來的點.
那么大部答案就是縮完點之后入度為 \(0\) 的聯通塊數量.
但是,會有特殊情況:

如圖,我們就只要查 \(2\) 或者 \(1\) 其中的一點即可.
也就是說如果一個聯通塊僅包含一個點,且其出邊所到的點都能由其他點推導出來.
那么我們可以通過調整對于入度為 \(0\) 的點的訪問順序以忽略這個點.
同時這樣的點只能有一個(可以很簡單舉出反例).

Code

#include<bits/stdc++.h> using namespace std; const int maxn=1000008; struct sj{int to,next;}a[maxn]; int head[maxn],size,flagg; int dfn[maxn],low[maxn]; int sta[maxn],top,belong[maxn]; int cnt,tot,v[maxn],n; int du[maxn],ans,num,m; int fr[maxn],to[maxn],siz[maxn]; void add(int x,int y) {a[++size].to=y;a[size].next=head[x];head[x]=size; }void tarjan(int x) {dfn[x]=low[x]=++tot;sta[++top]=x;v[x]=1;for(int i=head[x];i;i=a[i].next){int tt=a[i].to;if(!dfn[tt]){tarjan(tt);low[x]=min(low[x],low[tt]);}else if(v[tt]) low[x]=min(low[x],dfn[tt]);}if(dfn[x]==low[x]){belong[x]=++cnt;v[x]=0;do{siz[cnt]++;belong[sta[top]]=cnt;v[sta[top]]=0;}while(sta[top--]!=x);} }int main() {scanf("%d%d",&n,&m);for(int i=1;i<=m;i++){int x,y; scanf("%d%d",&x,&y);add(x,y);}for(int i=1;i<=n;i++)if(!dfn[i])tarjan(i);for(int x=1;x<=n;x++)for(int i=head[x];i;i=a[i].next){int tt=a[i].to;if(belong[tt]!=belong[x])du[belong[tt]]++,fr[++num]=belong[x],to[num]=belong[tt];}memset(a,0,sizeof(a));memset(head,0,sizeof(head));size=0;for(int i=1;i<=num;i++)add(fr[i],to[i]);for(int x=1;x<=cnt;x++)if(du[x]==0){ans++;if(siz[x]==1){int flag=1;for(int i=head[x];i;i=a[i].next){int tt=a[i].to;if(du[tt]==1){flag=0;break;}}if(!flagg)flagg=flag;if(!head[x])flagg=1;}}ans-=flagg;if(n==1)ans=0;if(m==0)ans=n-1;printf("%.6lf\n",(n*1.0-ans*1.0)/(n*1.0)); }

轉載于:https://www.cnblogs.com/Kv-Stalin/p/9605664.html

總結

以上是生活随笔為你收集整理的[中山市选]杀人游戏 (Tarjan缩点)的全部內容,希望文章能夠幫你解決所遇到的問題。

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