BZOJ2438 杀人游戏

来源:互联网 发布:淘宝王者荣耀cdkey 编辑:程序博客网 时间:2024/04/28 23:59

题目: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;}
0 0
原创粉丝点击