zoukankan      html  css  js  c++  java
  • poj 3275 Ranking the Cows

    这个题目其实挺巧妙的。

    最坏情况下要再加几次询问才能确定每头牛的rank。

           首先我们考虑最坏情况下要多少条有向边才能确定一个图的顶点的排序。答案是n*(n-1)/2.

           这个简单说明一下,首先找一个点向所有其他的点连接一条边,这样仅仅确定了一个顶点是最高等级,去掉该点。然后重复该过程。到确定所有顶点排位的时候就用了上述的边数。

           那么现在就很容易了。依次确定每个顶点可以访问到的顶点数目,再累加起来得到sum。这个其实就是现在已经有的边数。再用上述边数减去sum就是答案。



    #include <iostream>

    #include <cstdio>
    #include <cstring>
    using namespace std;
    const int maxn=1e3+9,maxm=1e4+9;
    int n,m;


    int head[maxn],lon;
    struct
    {
        int to,next;
    }e[maxm];
    void edgemake(int from,int to)
    {
        e[++lon].to=to;
        e[lon].next=head[from];
        head[from]=lon;
    }
    void edgeini()
    {
        memset(head,-1,sizeof(head));
        lon=-1;
    }


    int flag[maxn];
    int dfs(int t)
    {
        flag[t]=1;
        int ret=1;
        for(int k=head[t];k!=-1;k=e[k].next)
        {
            int u=e[k].to;
            if(!flag[u])
            ret+=dfs(u);
        }
        return(ret);
    }


    int main()
    {
        scanf("%d %d",&n,&m);
        edgeini();
        for(int i=1,from,to;i<=m;i++)
        {
            scanf("%d %d",&from,&to);
            edgemake(from,to);
        }
        int ans=0;
        for(int i=1;i<=n;i++)
        {
            memset(flag,0,sizeof(flag));
            ans+=dfs(i)-1;
        }


        printf("%d\n",n*(n-1)/2-ans);
        return 0;
    }

  • 相关阅读:
    var与dynamic
    SQL Server占用服务器内存过高
    SQL SERVER 2012/ 2014 分页,用 OFFSET,FETCH NEXT改写ROW_NUMBER的用法
    SQL Server 2012 OFFSET/FETCH NEXT分页示例
    Solr初始化源码分析-Solr初始化与启动
    (c#) 销毁资源和释放内存
    C#中 ThreadStart和ParameterizedThreadStart区别
    MongoDB的C#封装类
    mongo DB for C#
    C#操作MongoDB
  • 原文地址:https://www.cnblogs.com/xinyuyuanm/p/3030730.html
Copyright © 2011-2022 走看看