zoukankan      html  css  js  c++  java
  • HDU5695:Gym Class(优先队列+拓扑排序)

    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值。然后如果读入一个A,B表示A不想B站在A的前面。那么就引一条从A到B的有向边。如果要进入队列 入度应该为0
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<queue>
    #include<algorithm>
    using namespace std;
    vector<int>v[100001];
    priority_queue<int>q;
    int in[100001];
    int main()
    {
       int t;
       scanf("%d",&t);	
       long long sum;
       while(t--)
       {
       	memset(in,0,sizeof(in));
       	int n,m;
       	scanf("%d%d",&n,&m);
       	while(!q.empty() )
          	q.pop() ;
       	for(int i=1;i<=n;i++)
       	{
       	    v[i].clear();//清空 
    	   }
    	   int a,b;
    	   for(int i=0;i<m;i++)
    	   {
    	   	scanf("%d%d",&a,&b);
    	   	v[a].push_back(b); 
    	   	in[b]++;//标记 
    	   }
    	  for(int i=1;i<=n;i++)
    	 {
    		if(in[i]==0)
    		q.push(i); 
        	}
        	int mi=n;
             sum=0;
        	while(!q.empty() )
        	{
        		int k=q.top() ;
        		q.pop() ;
        		for(int i=0;i<v[k].size();i++ )
        		{
        			in[v[k][i]]--;
        			if(in[v[k][i]]==0)//当入度为0时  加入队列 
        			q.push(v[k][i]); 
    			}
    			mi=min(mi,k);//找出到目前为止队列中最小的序号 
    			sum+=mi;
    		}
    		printf("%lld
    ",sum);
       }
    	return 0;
    }
    


  • 相关阅读:
    Javascript内容整理——BOM
    前端实现excel报表,vue+luckysheet
    代码转图片 的一个好用网站
    推荐一个非常好用前端在线编辑器!!! 一点都不卡
    前端常用的一些网站
    vue中使用moment,如何按需打包?
    better-scroll
    时间线
    碎纸屑动画
    动画
  • 原文地址:https://www.cnblogs.com/kingjordan/p/12027029.html
Copyright © 2011-2022 走看看