2016 百度之星初赛 Gym Class(优先队列+拓扑排序)
2016-05-21 17:13
375 查看
Problem Description
众所周知,度度熊喜欢各类体育活动。
今天,它终于当上了梦寐以求的体育课老师。第一次课上,它发现一个有趣的事情。在上课之前,所有同学要排成一列, 假设最开始每个人有一个唯一的ID,从1到NN,在排好队之后,每个同学会找出包括自己在内的前方所有同学的最小ID,作为自己评价这堂课的分数。麻烦的是,有一些同学不希望某个(些)同学排在他(她)前面,在满足这个前提的情况下,新晋体育课老师——度度熊,希望最后的排队结果可以使得所有同学的评价分数和最大。
Input
第一行一个整数TT,表示T(1 \leq T \leq 30)T(1≤T≤30) 组数据。
对于每组数据,第一行输入两个整数NN和M (1 \leq N \leq 100000, 0 \leq M \leq 100000)M(1≤N≤100000,0≤M≤100000),分别表示总人数和某些同学的偏好。
接下来MM行,每行两个整数AA 和B(1 \leq A, B \leq N)B(1≤A,B≤N),表示ID为AA的同学不希望ID为BB的同学排在他(她)之前。你可以认为题目保证至少有一种排列方法是符合所有要求的。
Output
对于每组数据,输出最大分数 。
Sample Input
Copy
3
1 0
2 1
1 2
3 1
3 1
Sample Output
1
2
6
AC代码:
众所周知,度度熊喜欢各类体育活动。
今天,它终于当上了梦寐以求的体育课老师。第一次课上,它发现一个有趣的事情。在上课之前,所有同学要排成一列, 假设最开始每个人有一个唯一的ID,从1到NN,在排好队之后,每个同学会找出包括自己在内的前方所有同学的最小ID,作为自己评价这堂课的分数。麻烦的是,有一些同学不希望某个(些)同学排在他(她)前面,在满足这个前提的情况下,新晋体育课老师——度度熊,希望最后的排队结果可以使得所有同学的评价分数和最大。
Input
第一行一个整数TT,表示T(1 \leq T \leq 30)T(1≤T≤30) 组数据。
对于每组数据,第一行输入两个整数NN和M (1 \leq N \leq 100000, 0 \leq M \leq 100000)M(1≤N≤100000,0≤M≤100000),分别表示总人数和某些同学的偏好。
接下来MM行,每行两个整数AA 和B(1 \leq A, B \leq N)B(1≤A,B≤N),表示ID为AA的同学不希望ID为BB的同学排在他(她)之前。你可以认为题目保证至少有一种排列方法是符合所有要求的。
Output
对于每组数据,输出最大分数 。
Sample Input
Copy
3
1 0
2 1
1 2
3 1
3 1
Sample Output
1
2
6
AC代码:
#include<cstdio> #include<cstring> #include<algorithm> #include<queue> using namespace std; struct no { int v; int nex; }; int point[100050]; int degree[100050]; long long int res[100050]; struct node { int u,v; }; node aa[100050]; int tot; no a[100050]; void add(int u,int v) { a[tot].v=v; a[tot].nex=point[u]; point[u]=tot; tot++; degree[v]++; } int main() { int t; scanf("%d",&t); while(t--) { int n,m; memset(point,-1,sizeof(point)); scanf("%d%d",&n,&m); memset(degree,0,sizeof(degree)); tot=0; priority_queue<int,vector<int>, less <int> > Q; for(int i=0; i<m; i++) { int u,v; scanf("%d%d",&u,&v); add(u,v); } for(int i=1;i<=n;i++) { if(degree[i]==0) Q.push(i); } for(int i=1; i<=n; i++) { long long int p=-1; p=Q.top(); Q.pop(); res[i]=p; for(int tt=point[p];tt!=-1;tt=a[tt].nex) { int v=a[tt].v; degree[v]--; if(degree[v]==0) Q.push(v); } } long long int x=999999999; long long int ans=0; ans+=res[1]; x=res[1]; for(int i=2;i<=n;i++) { if(res[i]<x) { x=res[i]; ans+=x; } else { ans+=x; } } printf("%I64d\n",ans); } }
相关文章推荐
- ROLL A BALL (Unity 3D 入门) 游戏制作指导 - 滚珠游戏介绍
- Invert Binary Tree
- 课程疑问小结
- 树莓派使用虚拟键盘
- (行为型模式)TEMPLATE METHOD——模板方法模式
- 2016.5.21【初中部 NOIP提高组 】模拟赛A 总结
- 栈的压入、弹出序列——22
- 伟大的数学家马尔可夫,以及他对互联网的重要贡献
- poj2785题解
- SAX - Hello World
- ViewHolder重用机制 RecyclerView+CardView 优化
- Spring-bean作用域scope详解
- (创建型模式)PROTOTYPE——原型模式
- hdu_5695_Gym Class(拓扑排序)
- Hive连接MongoDB
- 2016"百度之星" - 初赛(Astar Round2A) 1001 All X(数论知识)
- android反编译工具Apktool安装与使用
- hdu_5695_Gym Class(拓扑排序)
- C# split字符串
- (创建型模式)FACTORY METHOD——工厂方法模式