题目链接:acm.hdu.edu.cn/showproblem.php?pid=5695
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 }
原文:https://www.cnblogs.com/acgoto/p/9313373.html