82pts求救!悬关
查看原帖
82pts求救!悬关
1050431
DevilsFlame楼主2024/8/9 15:15
#include<bits/stdc++.h>
#define N 100010
using namespace std;
int n,a,b,m,dfn[N],low[N],cnt,stk[N],top;
int to[N],col,d[N],ans,s[N],in[N];
vector <int> e[N],c[N];
map <int,map <int,bool> > pl;
void tarjan(int x)
{
//	cout << x << endl;
	stk[++ top] = x;
	dfn[x] = low[x] = ++ cnt;
	in[x] = 1;
	bool q = 1;
	for(int i = 0;i < e[x].size();i ++)
	{
		int v = e[x][i];
		if(!dfn[v])
		{
			tarjan(v);
			low[x] = min(low[x],low[v]);
		}
		else if(in[v]) low[x] = min(low[x],dfn[v]);
	}
	if(dfn[x] == low[x])
	{
		to[x] = ++ col;
		s[col] = 1;
		in[x] = 0;
		while(stk[top] != x)
		{
			to[stk[top]] = col;
			in[stk[top]] = 0;
			s[col] ++;
			top --;
		}
		top --;
	}
	return;
}
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
    cin >> n >> m;
    for(int i = 1;i <= m;i ++)
    {
        cin >> a >> b;
        e[a].push_back(b);
    }
    for(int i = 1;i <= n;i ++)
    	if(!dfn[i]) tarjan(i);
	for(int i = 1;i <= n;i ++)
		for(int j = 0;j < e[i].size();j ++)
		{
			int u = to[i],v = to[e[i][j]];
			if(u != v && !pl[u][v])
			{
			    d[v] ++;
			    c[u].push_back(v);
			    pl[u][v] = 1;
			}
		}
	bool k = 1;
	for(int i = 1;i <= col;i ++)
	{
		if(!d[i]) ans ++;
		if(d[i] or s[i] > 1 or !k) continue;
		bool ch = 1;
		for(int j = 0;j < c[i].size();j ++)
			if(d[j] < 2)
			{
			    ch = 0;
				break;
			}
		if(ch)
		{
			ans --;
			k = 0;
		}
	}
	printf("%.6lf\n",1.0 * (n - ans) / n);
	return 0;
}
2024/8/9 15:15
加载中...