zoukankan      html  css  js  c++  java
  • uva 11504 Dominos动态分配内存

    这题是给定许多骨牌,以及相对应的关系, a->b 就表示a 倒之后会推倒 b

    题目要求说最少推倒几个就可以使骨牌全部倒!

    View Code
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <stack>
    using namespace std;
    
    #define Max  100009
    #define max(a,b) a>b?a:b
    
    struct node{
        int u,v,next;
    }*Edge;
    
    stack<int> S;
    
    int k,Dindex,Stop,Bcnt,n,m;
    int head[Max],DFN[Max],LOW[Max],Belong[Max];
    int in[Max];
    bool instack[Max];
    
    void add(int u,int v){
        Edge[k].u = u;
        Edge[k].v = v;
        Edge[k].next = head[u];
        head[u] = k++;
    }
    
    void tarjan(int i)
    {
        int j;
        DFN[i]=LOW[i]=++Dindex;
        instack[i]=true;
        S.push(i);
        for (int w=head[i];w!=-1;w=Edge[w].next)
        {
            j=Edge[w].v;
            if (!DFN[j])
            {
                tarjan(j);
                if (LOW[j]<LOW[i])
                    LOW[i]=LOW[j];
            }
            else if (instack[j] && DFN[j]<LOW[i])
                LOW[i]=DFN[j];
        }
        if (DFN[i]==LOW[i])
        {
            Bcnt++;
            do
            {
                j=S.top();
                S.pop();
                instack[j]=false;
                Belong[j]=Bcnt;
            }
            while (j!=i);
        }
    }
    
    void init() {
        while(!S.empty())
            S.pop();
        memset(head,-1,sizeof(head));
        memset(DFN,0,sizeof(DFN));
        memset(in,0,sizeof(in));
        k=Dindex=Stop=Bcnt=0;
    }
    
    int main() {
        int t;
        scanf("%d",&t);
        while(t--) {
            scanf("%d%d",&n,&m);
            Edge = new node[m+5];
            init();
            for(int i=0;i<m;i++) {
                int a,b;
                scanf("%d%d",&a,&b);
                add(a,b);
            }
            for(int i=1;i<=n;i++) {
                if(!DFN[i])
                    tarjan(i);
            }
            for(int i=0;i<k;i++) {
                int s = Belong[Edge[i].u];
                int e = Belong[Edge[i].v];
                if(s != e)
                    in[e]++;
            }
            int ans = 0;
            for(int i=1;i<=Bcnt;i++) {
                if(in[i] == 0)
                    ans++;
            }
            printf("%d\n",ans);
            delete[] Edge;
        }
        return 0;
    }

    不动态分配内存会RE,无解的RE!!!

    关于系统内存分配的资料

    http://blog.csdn.net/netgeek/article/details/1817311

  • 相关阅读:
    windows p12(pfx)个人证书安装过程
    OpenSSL库验证PKCS7签名
    Crypto库实现PKCS7签名与签名验证
    windows 系统中打开一个数字证书所经历的过程
    DBA不可不知的操作系统内核参数
    MySQL大表优化方案
    深入浅出Cache
    Git Stash用法
    Git服务器搭建全过程分步详解
    laravel 5.1 性能优化对比
  • 原文地址:https://www.cnblogs.com/gray035/p/2963628.html
Copyright © 2011-2022 走看看