zoukankan      html  css  js  c++  java
  • 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 ");
                else
                    printf("%d ",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 ",sum);
        }
        return 0;
    }


  • 相关阅读:
    [#]
    Windows 下配置 ApacheBench (AB) 压力测试
    [转载]
    Nginx 系列教程
    设置外接显示器顺序(哪个在左,哪个在右)的方法
    [.Net] 一句话Linq(递归查询)
    [Xamarin]
    [SVN]
    [SQL SERVER]
    [Oracle]
  • 原文地址:https://www.cnblogs.com/zhangdashuai/p/3702158.html
Copyright © 2011-2022 走看看