hdu 2767 超内存 哪位大神能帮忙改改

#include<iostream>
using namespace std;
struct G
{
    int dest;
    G *next;
};
int n,m;
G *ga[20001];
G *gt[20001];
G *g[20001];
int path[20001];
int in[20001];
int out[20001];
int vis[20010];
int part[20001];
char map[20001][20001];
void addedge(G *g[],int i,int j)
{
    G *l=new G;
    l->dest=j;
    l->next=g[i];
    g[i]=l;
}
void dfsa(int u)
{
    G *l=ga[u];
    if(!vis[u])
    {
        vis[u]=1;
        for(l;l!=NULL;l=l->next)
            dfsa(l->dest);
        path[0]++;
        path[path[0]]=u;
    }
}
void dfst(int u)
{
    G *l=gt[u];
    if(!vis[u])
    {
        vis[u]=1;
        for(l;l!=NULL;l=l->next)
            dfst(l->dest);
        part[u]=part[0];
    }
}
void k()
{
    int i;
    path[0]=0;
    memset(vis,0,sizeof(vis));
    //搜索原图
    for(i=1;i<=n;i++)
    {
        if(!vis[i])
            dfsa(i);
    }
    memset(vis,0,sizeof(vis));
    int sum=0;
    part[0]=0;
    for(i=n;i>=1;i--)
    {
        if(!vis[path[i]])
        {
            part[0]++;
            dfst(path[i]);
        }
    }
    //创建新图
    G *l;
    memset(map,0,sizeof(map));
    for(i=1;i<=n;i++)//  剔除连通分量
    {
        for(l=ga[i];l!=NULL;l=l->next)
        {
            int k=part[i];
            int j=part[l->dest];
            if(k!=j&&map[k][j]==0)
            {
                map[k][j]=1;
                addedge(g,k,j);
            }
        }
    }    
}
int main()
{
    int t;
    int a,b,i;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d",&n,&m);
        if(m==0)
        {
            if(n==1)
            printf("0\n");
            else
                printf("%d\n",n);
            continue;
        }
        for(i=1;i<=n;i++)
            ga[i]=gt[i]=NULL;
        while(m--)
        {
            scanf("%d%d",&a,&b);
            addedge(ga,a,b);
            addedge(gt,b,a);
        }
        k();
        memset(out,0,sizeof(out));
        memset(in,0,sizeof(in));
        G *l;
        int sum=0;
        for(i=1;i<=part[0];i++)
        {
            for(l=g[i];l!=NULL;l=l->next)
            {
                out[i]++;in[l->dest]++;
            }
        }
        for(i=1;i<=part[0];i++)
            if(!out[i]&&in[i])
                sum++;
        printf("%d\n",sum);
    }
    return 0;
}


posted @ 2014-04-18 19:55  _一千零一夜  阅读(130)  评论(0编辑  收藏  举报