hdu 5695 Gym Class

来源:互联网 发布:编程电脑配置 编辑:程序博客网 时间:2024/06/16 16:05

http://acm.hdu.edu.cn/showproblem.php?pid=5695


用拓扑排序将初始关系排好,再用优先队列来将大的尽量放到前面。


#include <iostream>#include <stdio.h>#include <string.h>#include <algorithM>#include <cmath>#include <queue>#include <list>#include <vector>using namespace std;int m,n;int rudu[111111];priority_queue<int>q;vector<int>v[111111];int vis[111111];int b[111111];int main(){int t;cin>>t;   while(t--)   {         scanf("%d%d",&n,&m);      int i;      for(i=1;i<=n;i++)      {         v[i].clear();         vis[i]=0;  }       memset(rudu,0,sizeof(rudu));       for(i=1;i<=m;i++)       {            int a,b;           scanf("%d%d",&a,&b);           rudu[b]++;           v[a].push_back(b);       }       for(i=1;i<=n;i++)       {          if(rudu[i]==0)          {          q.push(i);          vis[i]=1;  }   }   long long sum=0;    int minn=n;    int z=0;   while(!q.empty())   {       int k=q.top();      b[z++]=k;      q.pop();      int ss=v[k].size();      for(i=0;i<ss;i++)      {          int y=v[k][i];         rudu[y]--;         if(!rudu[y]&&!vis[y])         {         q.push(y);         vis[y]=1;   }  }   }   for(i=0;i<n;i++)   {    if(minn>b[i])    {    minn=b[i];}sum+=minn;   }   cout<<sum<<endl;   }   return 0;}





原创粉丝点击