求调,WAon#2,刚学OI 1e-9ms
查看原帖
求调,WAon#2,刚学OI 1e-9ms
615727
swz8438楼主2024/11/26 20:55
#include<bits/stdc++.h>
using namespace std;
#define N 100005
int n,m;
vector<int>e[N];
int dfn[N],low[N],tot,stk[N],top;
bool instk[N];
int scc[N],sc,sz[N];
void tj(int now){
    dfn[now]=low[now]=++tot,stk[++top]=now,instk[now]=1;
    for(int to:e[now]){
        if(!dfn[to]){
            tj(to);
            low[now]=min(low[now],low[to]);
        }else if(instk[to]){
            low[now]=min(low[now],dfn[to]);
        }
    }
    if(dfn[now]==low[now]){
        sc++;
        while (stk[top]!=now)
        {
            scc[stk[top]]=sc;
            sz[sc]++;
            instk[stk[top]]=0;
            top--;
        }
        scc[stk[top]]=sc;
        sz[sc]++;
        instk[stk[top]]=0;
        top--;
    }
}
int in[N];
vector<int>ee[N];
int main(){
    ios::sync_with_stdio(0);
    cin>>n>>m;
    for(int i=1,u,v;i<=m;i++){
        cin>>u>>v;
        e[u].push_back(v);
    }
    for(int i=1;i<=n;i++) if(!dfn[i]) tj(i);
    bool vis[N];
    for(int i=1;i<=n;i++){
        for(int j:e[i]){
            if(scc[i]!=scc[j] && !vis[scc[j]]){
                in[scc[j]]++;
                vis[scc[j]]=1;
                ee[scc[i]].push_back(scc[j]);
            }
        }
        for(int j:e[i]) vis[scc[j]]=0;
    }
    int ans=0;bool tmp=0;
    for(int i=1;i<=sc;i++){
        if(in[i]==0){
            ans++;
            if(sz[i]==1){
                bool flag=1;
                for(int j:ee[i]){
                    if(in[j]==1) flag=0;
                }
                tmp|=flag;
            }
        }
    }
    cout<<fixed<<setprecision(6)<<(double)(n-ans+tmp)/n;
    return 0;
}
2024/11/26 20:55
加载中...