题解报告:hdu 5695 Gym Class(拓扑排序)
生活随笔
收集整理的這篇文章主要介紹了
题解报告:hdu 5695 Gym Class(拓扑排序)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
題目鏈接:acm.hdu.edu.cn/showproblem.php?pid=5695
Problem Description
眾所周知,度度熊喜歡各類體育活動。今天,它終于當上了夢寐以求的體育課老師。第一次課上,它發(fā)現(xiàn)一個有趣的事情。在上課之前,所有同學要排成一列, 假設最開始每個人有一個唯一的ID,從1到N,在排好隊之后,每個同學會找出包括自己在內(nèi)的前方所有同學的最小ID,作為自己評價這堂課的分數(shù)。麻煩的是,有一些同學不希望某個(些)同學排在他(她)前面,在滿足這個前提的情況下,新晉體育課老師——度度熊,希望最后的排隊結(jié)果可以使得所有同學的評價分數(shù)和最大。
Input
第一行一個整數(shù)T,表示T(1≤T≤30)?組數(shù)據(jù)。對于每組數(shù)據(jù),第一行輸入兩個整數(shù)N和M(1≤N≤100000,0≤M≤100000),分別表示總?cè)藬?shù)和某些同學的偏好。
接下來M行,每行兩個整數(shù)A?和B(1≤A,B≤N),表示ID為A的同學不希望ID為B的同學排在他(她)之前。你可以認為題目保證至少有一種排列方法是符合所有要求的。
Output
對于每組數(shù)據(jù),輸出最大分數(shù) 。Sample Input
3 1 0 2 1 1 2 3 1 3 1Sample Output
1 2 6 解題思路:要使得所有同學的評價分數(shù)和最大,必須每次拓撲出最大的id值(采用優(yōu)先隊列最大堆來實現(xiàn)),再保存當前已拓撲的最小id即為隊列中后面學生的課堂分數(shù),并且把每次分數(shù)相加起來即為評價的總分數(shù),水過! 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越靠前的最后的評價分數(shù)將會是最大的 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;}//開關(guān):記錄第一個拓撲的id值 16 minid=min(minid,now);sum+=minid;//每次更新最小的id,并且加入到sum當中 17 for(size_t i=0;i<vec[now].size();++i)//更新每個鄰接點的入度數(shù) 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 }?
轉(zhuǎn)載于:https://www.cnblogs.com/acgoto/p/9313373.html
總結(jié)
以上是生活随笔為你收集整理的题解报告:hdu 5695 Gym Class(拓扑排序)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring boot 配置文件 使用占
- 下一篇: 20180716:开博宣言