题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2438
分析:只能说wori…整一页都是WA
代码:
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <stack>
#include <vector>
#include <map>
using namespace std;
const int Tmax=100005;
int n,m,last,cnt,dfn[Tmax],low[Tmax],belong[Tmax],com[Tmax],ans,num[Tmax];
bool in[Tmax];
vector<int> G[Tmax],GG[Tmax];
stack<int> ST;
void tarjan(int x)
{
int i,len=G[x].size(),to;
dfn[x]=low[x]=++last;
ST.push(x);
in[x]=true;
for(i=0;i<len;i++)
{
to=G[x][i];
if(dfn[to]==0)
{
tarjan(to);
low[x]=min(low[x],low[to]);
}
else if(in[to]) low[x]=min(low[x],dfn[to]);
}
if(dfn[x]==low[x])
{
cnt++;
do{
to=ST.top();
ST.pop();
in[to]=false;
belong[to]=cnt;
num[cnt]++;
}while(to!=x);
}
return;
}
void init()
{
int i,len,j;
for(i=1;i<=n;i++)
{
len=G[i].size();
for(j=0;j<len;j++)
if(belong[i]!=belong[G[i][j]])
{
GG[belong[i]].push_back(belong[G[i][j]]);
com[belong[G[i][j]]]++;
}
}
return;
}
void work()
{
int i,j,len;
bool ok;
for(i=1;i<=cnt;i++)
if(com[i]==0) ans++;
for(i=1;i<=cnt;i++)
{
ok=true;
if(com[i]!=0||num[i]!=1) continue;
len=GG[i].size();
for(j=0;j<len;j++)
if(com[GG[i][j]]==1)
ok=false;
if(ok){
ans--;
return;
}
}
return;
}
int main()
{
int i,u,v;
scanf("%d%d",&n,&m);
for(i=1;i<=m;i++)
{
scanf("%d%d",&u,&v);
G[u].push_back(v);
}
for(i=1;i<=n;i++)
if(dfn[i]==0) tarjan(i);
init();
work();
printf("%.6lf",(1.0*(n-ans))/(1.0*n));
return 0;
}