标签:pre can tle following bsp get stack sep script
2 4 3 3 2 2 0 2 1 3 3 1 0 2 1 0 2
Case 1: 2 0 1 Case 2: 2 0 1 2
#include<iostream>
#include<cstdio>
#include<cstring>
#include<stack>
#include<queue>
using namespace std;
#define Max 5005
int head[Max],head2[Max],j,k,bcnt,dindex,dfn[Max],low[Max],belong[Max],sup[Max];
bool visit[Max],vis[Max];;
stack<int> s;
struct
{
    int s;
    int e;
    int next;
}edge[Max*6],edge2[Max*6];
void add(int s,int e)
{
    edge[k].s=s;
    edge[k].e=e;
    edge[k].next=head[s];
    head[s]=k++;
}
void add2(int s,int e)
{
    edge2[j].s=s;
    edge2[j].e=e;
    edge2[j].next=head2[s];
    head2[s]=j++;
}
void tarjan(int i)
{
    int ed;
    dfn[i]=low[i]=++dindex;
    visit[i]=true;
    s.push(i);
    for(int t=head[i];t!=-1;t=edge[t].next)
    {
        ed=edge[t].e;
        if(!dfn[ed])
        {
            tarjan(ed);
            if(low[i]>low[ed])
                low[i]=low[ed];
        }
        else if(visit[ed]&&low[i]>dfn[ed])
            low[i]=dfn[ed];
    }
    if(dfn[i]==low[i])
    {
        bcnt++;
        do
        {
            ed=s.top();
            s.pop();
            visit[ed]=false;
            belong[ed]=bcnt;
        }while(i!=ed);
    }
}
void solve(int n)
{
    int i;
    bcnt=dindex=0;
    memset(visit,false,sizeof(visit));
    memset(low,0,sizeof(low));
    memset(belong,0,sizeof(belong));
    memset(dfn,0,sizeof(dfn));
    while(!s.empty())
        s.pop();
    for(i=0;i<n;i++)
        if(!dfn[i])
            tarjan(i);
}
int bfs(int rt)
{
    int i,st,ed,sum=0;
    vis[rt]=true;
    queue<int> q;
    q.push(rt);
    while(!q.empty())
    {
        st=q.front();
        q.pop();
        for(i=head2[st];i!=-1;i=edge2[i].next)
        {
            ed=edge2[i].e;
            if(!vis[ed])
            {
                sum+=sup[ed]+1;
                q.push(ed);
                vis[ed]=true;
            }
        }
    }
    return sum;
}
int main()
{
    int i,t,m,n,a,b,ans[Max],sum[Max],flag,cnt,p[Max],ncase=1;
    scanf("%d",&t);
    while(t--)
    {
        flag=-1;
        j=k=cnt=0;
        memset(p,0,sizeof(p));
        memset(ans,0,sizeof(ans));
        memset(sum,0,sizeof(sum));
        memset(head,-1,sizeof(head));
        memset(head2,-1,sizeof(head2));
        memset(sup,0,sizeof(sup));
        scanf("%d%d",&n,&m);
        while(m--)
        {
            scanf("%d%d",&a,&b);
            add(a,b);
        }
        solve(n);
        for(i=0;i<k;i++)
        {
            int st=edge[i].s;
            int ed=edge[i].e;
            if(belong[st]!=belong[ed])
                add2(belong[ed],belong[st]);
        }
        for(i=0;i<n;i++)
            sup[belong[i]]++;
        for(i=1;i<=bcnt;i++)
            sup[i]--;
        for(i=1;i<=bcnt;i++)
        {
            memset(vis,false,sizeof(vis));
            sum[i]=bfs(i)+sup[i];
        }
        for(i=0;i<n;i++)
        {
            ans[i]=sum[belong[i]];
            flag=max(flag,ans[i]);
        }
        for(i=0;i<n;i++)
        {
            if(ans[i]==flag)
                p[cnt++]=i;
            //cout<<ans[i]<<endl;
        }
        printf("Case %d: %d\n",ncase++,flag);
        for(i=0;i<cnt;i++)
            printf("%d%c",p[i],i==cnt-1?‘\n‘:‘ ‘);
    }
    return 0;
}标签:pre can tle following bsp get stack sep script
原文地址:http://www.cnblogs.com/tlnshuju/p/6922550.html