码迷,mamicode.com
首页 > 编程语言 > 详细

题解报告:hdu 5695 Gym Class(拓扑排序)

时间:2018-07-15 14:55:17      阅读:235      评论:0      收藏:0      [点我收藏+]

标签:max   tor   als   desc   rip   ace   最大的   拓扑排序   scan   

题目链接:acm.hdu.edu.cn/showproblem.php?pid=5695

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\n",sum);
33     }
34     return 0;
35 }

 

题解报告:hdu 5695 Gym Class(拓扑排序)

标签:max   tor   als   desc   rip   ace   最大的   拓扑排序   scan   

原文地址:https://www.cnblogs.com/acgoto/p/9313373.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!