#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <queue>
#define M 100010
using namespace std;
int in[M];
vector<int>v[M]; //出度
priority_queue<int>q;
int main()
{
int t;
long i,k,n,m,a,b;
__int64 ans;
cin>>t;
while(t--)
{
cin>>n>>m;
for(i=1;i<=n;i++)
{
v[i].clear();// 清空
}
memset(in,0,sizeof(in));
while(m--)
{
scanf("%ld%ld",&a,&b);
in[b]++;
v[a].push_back(b);
}
for(i=1;i<=n;i++)
{
if(in[i]==0) q.push(i);
}
ans=0;
long Min=n; //包括自己在内的前方所有同学的最小ID
while(!q.empty())
{
k=q.top(); //包括自己在内的前方所有同学的最小ID ->贪心 大的排前面 每次在入度为0中挑一个最大的出列
q.pop();
for(i=0;i<v[k].size();i++)
{
in[v[k][i]]--;
if(in[v[k][i]]==0)
{
q.push(v[k][i]);
}
}
Min=min(Min,k);
ans+=Min;
}
printf("%I64d\n",ans);
}
return 0;
}
hdu5695 贪心+拓扑排序
最新推荐文章于 2020-08-05 19:13:07 发布