• 2016"百度之星"


    Gym Class

     Time Limit: 6000/1000 MS (Java/Others)
     
     Memory Limit: 65536/65536 K (Java/Others)
    Problem Description

    众所周知,度度熊喜欢各类体育活动。

    今天,它终于当上了梦寐以求的体育课老师。第一次课上,它发现一个有趣的事情。在上课之前,所有同学要排成一列, 假设最开始每个人有一个唯一的ID,从1到NN,在排好队之后,每个同学会找出包括自己在内的前方所有同学的最小ID,作为自己评价这堂课的分数。麻烦的是,有一些同学不希望某个(些)同学排在他(她)前面,在满足这个前提的情况下,新晋体育课老师——度度熊,希望最后的排队结果可以使得所有同学的评价分数和最大。

    Input

    第一行一个整数TT,表示T(1 leq T leq 30)T(1T30) 组数据。

    对于每组数据,第一行输入两个整数NN和M (1 leq N leq 100000, 0 leq M leq 100000)M(1N100000,0M100000),分别表示总人数和某些同学的偏好。

    接下来MM行,每行两个整数AA 和B(1 leq A, B leq N)B(1A,BN),表示ID为AA的同学不希望ID为BB的同学排在他(她)之前。你可以认为题目保证至少有一种排列方法是符合所有要求的。

    Output

    对于每组数据,输出最大分数 。

    Sample Input
    3
    1 0
    2 1
    1 2
    3 1
    3 1
    
    Sample Output
    1
    2
    6
    思路:每次取最大的数放前面,topsort;
    #include <iostream>
    #include <algorithm>
    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include<queue>
    #include<map>
    #include<vector>
    using namespace std;
    #define ll __int64
    #define inf 99999999
    int n,m;
    int du[100010];
    int flag[100010];
    int ans[100010];
    void init()
    {
        memset(du,0,sizeof(flag));
        memset(flag,0,sizeof(flag));
    }
    int main() {
        int x,y,z,i,t;
        int T;
        scanf("%d",&T);
        while(T--)
        {
            init();
            vector<int>v[100010];
            priority_queue<int>q;
            scanf("%d%d",&n,&m);
            for(i=0;i<m;i++)
            {
                int u,vv;
                scanf("%d%d",&u,&vv);
                v[u].push_back(vv);
                du[vv]++;
            }
            int ji=0;
            for(i=1;i<=n;i++)
            if(du[i]==0)
            q.push(i),flag[i]=1;
            while(!q.empty())
            {
                int gg=q.top();
                q.pop();
                ans[ji++]=gg;
                for(i=0;i<v[gg].size();i++)
                {
                    int vv=v[gg][i];
                    du[vv]--;
                    if(du[vv]==0&&!flag[vv])
                    q.push(vv),flag[vv]=1;
                }
            }
            int minn=inf;
            ll getans=0;
            for(i=0;i<ji;i++)
            minn=min(minn,ans[i]),getans+=minn;
            printf("%I64d
    ",getans);
    
        }
        return 0;
    }
  • 相关阅读:
    页面访问权限控制
    购物车效果
    content: "e600"
    wf-删除所选
    event.target.getAttribute('id')
    css content
    mysql 浏览器submit中文, shell乱码
    导入导出
    mysql 标点符号
    mysql json
  • 原文地址:https://www.cnblogs.com/jhz033/p/5515213.html
Copyright © 2020-2023  润新知