• hdu 5695 Gym Class(拓扑排序)


    Problem Description

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

    Input

    第一行一个整数T,表示T(1T30) 组数据。
    对于每组数据,第一行输入两个整数NM(1N100000,0M100000),分别表示总人数和某些同学的偏好。
    接下来M行,每行两个整数A 和B(1A,BN),表示ID为A的同学不希望ID为B的同学排在他(她)之前。你可以认为题目保证至少有一种排列方法是符合所有要求的。

    Output

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

    Sample Input

    3
    1 0
    2 1
    1 2
    3 1
    3 1

    Sample Output

    1
    2
    6
    解题思路:要使得所有同学的评价分数和最大,必须每次拓扑出最大的id值(采用优先队列最大堆来实现),再保存当前已拓扑的最小id即为队列中后面学生的课堂分数,并且把每次分数相加起来即为评价的总分数,水过!
    AC代码:
     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 typedef long long LL;
     4 const int maxn=100005;
     5 vector<int> vec[maxn];
     6 priority_queue<int> que;//默认最大堆,id越靠前的最后的评价分数将会是最大的
     7 int t,n,m,a,b,minid,InDeg[maxn];LL sum;bool flag;
     8 void topsort(){
     9     while(!que.empty())que.pop();//清空队列
    10     for(int i=1;i<=n;++i)
    11         if(!InDeg[i])que.push(i);
    12     flag=false;
    13     while(!que.empty()){
    14         int now=que.top();que.pop();//取出当前最大的id,并且出队
    15         if(!flag){minid=now;flag=true;}//开关:记录第一个拓扑的id值
    16         minid=min(minid,now);sum+=minid;//每次更新最小的id,并且加入到sum当中
    17         for(size_t i=0;i<vec[now].size();++i)//更新每个邻接点的入度数
    18             if(--InDeg[vec[now][i]]==0)que.push(vec[now][i]);
    19     }
    20 }
    21 int main(){
    22     scanf("%d",&t);
    23     while(t--){
    24         scanf("%d%d",&n,&m);sum=0;
    25         memset(InDeg,0,sizeof(InDeg));
    26         for(int i=1;i<=n;++i)vec[i].clear();//每个邻接矩阵连接对应清空
    27         while(m--){
    28             scanf("%d%d",&a,&b);
    29             vec[a].push_back(b);//邻接表:a指向b
    30             InDeg[b]++;//b的入度加1
    31         }
    32         topsort();printf("%lld
    ",sum);
    33     }
    34     return 0;
    35 }
  • 相关阅读:
    Gradle
    ES6总结
    VSCode 开发Vue + ElementUI
    WEUIHalfscreen Dialog和mescroll冲突
    Raspberry Pi安装AdGuard Home
    浏览器跨域请求 原理和个人理解
    如何保证缓存与数据库双写时的数据一致性?
    关于软件系统中的高可用问题的碎碎念
    Android项目实战(六十三):as3.6+的一些警告解决方法
    引入官方uni.css样式
  • 原文地址:https://www.cnblogs.com/acgoto/p/9313373.html
Copyright © 2020-2023  润新知