hdu 5695 Gym Class (优先队列+拓扑排序)

题意:一群人编号1~n,给他们拓扑排序,已知其中的邻接关系,要求得到的拓扑序中,每个元素包括自己以及他前面的编号的最小值最大,求所有人的这个值的和。

思路:把正常拓扑排序的队列换成优先队列即可

//做的时候手滑把用于记录的变量和循环的变量名写重了结果t了一个晚上

//发现用for初始化比用memset初始化速度快,而且更省内存

#include <bits/stdc++.h>

using namespace std;
vector<int> adjl[100010];
    long long c,su;
    int v,e,s,t,in[100010];int ans[100010],countt;
void top_sort()
{priority_queue<int> q;
 for(int i=v;i>=1;i--)

            if(in[i]==0)

                q.push(i);






     while(!q.empty())
        {

            int vt=q.top();
            q.pop();
            ans[countt++]=vt;


            //c=min((long long)vt,c);

            //su+=c<vt?c:c=vt;


            for(int i=0;i<adjl[vt].size();i++)
            {

                in[adjl[vt][i]]--;
                if(in[adjl[vt][i]]==0)
                {
                    q.push(adjl[vt][i]);

                }
            }

        }
}







int main()
{
    int tt;


    scanf("%d",&tt);
    while(tt--)

    {

         scanf("%d%d",&v,&e);

         su=0;
     /*   memset(adjl,0,sizeof(adjl));
        memset(in,0,sizeof(in));*/
        for(int i=1;i<=v;i++){adjl[i].clear();in[i]=0;}
        for(int i=0;i<e;i++)
        {
            scanf("%d%d",&s,&t);
            adjl[s].push_back(t);
            in[t]++;

        }






countt=0;
       top_sort();
        c=INFINITY;
        for(int i=0;i<countt;i++)
        {
            //su+=c<ans[i]?c:c=ans[i];
            c=c>ans[i]?ans[i]:c;
            su+=c;
        }
    printf("%I64d\n",su);
        //for(int i=0;i<vec.size();i++)cout<<vec[i]<<" ";

      //  cout<<su<<endl;

    }
    return 0;

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值