ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

6081: Gym Class(拓扑排序+优先队列)

2019-10-27 19:55:55  阅读:275  来源: 互联网

标签:同学 int Gym ID maxn d1 d2 Class 6081


6081: Gym Class 分享至QQ空间

时间限制(普通/Java):1000MS/3000MS     内存限制:65536KByte
总提交: 40            测试通过:10

描述

 

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

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

 

输入

 

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

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

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

 

输出

 

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

 

样例输入

 

 

样例输出

1
2
6

解题思路:  拓扑排序确定关系,大的数尽量在前面小的数尽量在后面即可!  而优先队列恰好有这种功能

 1 #include <bits/stdc++.h>
 2 #define ll long long
 3 using namespace std;
 4 
 5 int t,n,m;
 6 const int maxn=1e5+5;
 7 int in[maxn];
 8 vector<ll> vec;
 9 vector<int> G[maxn];
10 
11 priority_queue<int> que;
12 void init(){
13     for(int i=1;i<=n;i++) G[i].clear();
14     vec.clear();
15     memset(in,0,sizeof(in));
16     while(!que.empty()) que.pop();
17 }
18 
19 void topsort(){
20     for(int i=1;i<=n;i++){
21         if(in[i]==0) que.push(i);
22     }
23     while(!que.empty()){
24         int top=que.top(); que.pop();
25         vec.push_back(top);
26         for(auto X:G[top]){
27             if(in[X]){
28                 --in[X];
29                 if(in[X]==0){
30                     que.push(X);
31                 }
32             }
33         }
34     }
35 
36 }
37 
38 int main(){
39     ios::sync_with_stdio(false);
40     cin>>t;
41     while(t--){
42         init();
43         cin>>n>>m;
44         for(int i=1,d1,d2;i<=m;i++){
45             cin>>d1>>d2;
46             G[d1].push_back(d2);
47             in[d2]++;
48         }
49         topsort();
50         int len=vec.size();
51         ll minn=0x3f3f3f3f3f3f3f3f,res=0;
52         for(int i=0;i<=len-1;i++){
53             minn=min(minn,vec[i]);
54 //            cout << minn << endl;
55             res+=minn;
56         }
57         cout << res << endl;
58     }
59     return 0;
60 
61 
62 }
View Code

 

标签:同学,int,Gym,ID,maxn,d1,d2,Class,6081
来源: https://www.cnblogs.com/qq-1585047819/p/11748679.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有