#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<queue>
using namespace std;
const int N=100000+10;
vector<int>v[N];
int in[N],ans[N];
priority_queue<int>q;
int main()
{
int _,mi,t,n,m,a,b;
long long ans;
scanf("%d",&_);
while(_--)
{
scanf("%d%d",&n,&m);
memset(in,0,sizeof(in));
while(!q.empty()) q.pop();
for(int i=1;i<=n;i++)
{
v[i].clear();
}
ans=0;
for(int i=0;i<m;i++)
{
scanf("%d%d",&a,&b);
in[b]++;
v[a].push_back(b);
}
for(int i=1;i<=n;i++)
if(in[i]==0) q.push(i);
mi=n;
while(!q.empty())
{
t=q.top();
q.pop();
for(int i=0;i<v[t].size();i++)
{
in[v[t][i]]--;
if(in[v[t][i]]==0) q.push(v[t][i]);
}
mi=min(mi,t);
ans+=mi;
}
printf("%lld\n",ans);
}
return 0;
}
hdu5695Gym Class 「拓扑排序」
最新推荐文章于 2018-05-07 19:54:30 发布