题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2647
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
#define MAXN 10002
using namespace std;
vector<int> mp[MAXN];
queue<int>Q;
int indegree[MAXN],reward[MAXN],n;
int toposort()
{
int i,j,t,x,tot=0;
while (!Q.empty())
{
Q.pop();
}
for(i=1;i<=n;++i)
{
if(!indegree[i])
{
Q.push(i);
reward[i]=888;
}
}
while (!Q.empty())
{
x=Q.front();
Q.pop();
tot++;
for(j=0;j<mp[x].size();++j)
{
t=mp[x][j];
indegree[t]--;
if(!indegree[t])
{
Q.push(t);
reward[t]=reward[x]+1;
}
}
}
if(tot<n)
return -1;
else
return 1;
}
int main()
{
int m,i,ans,a,b;
while (scanf("%d %d",&n,&m)!=EOF)
{
memset(indegree,0,sizeof(indegree));
memset(reward,0,sizeof(reward));
for(i=0;i<MAXN;++i)
mp[i].clear();
while (m--)
{
scanf("%d %d",&a,&b);
indegree[a]++;// a's reward should be more than b's
mp[b].push_back(a);
}
ans=toposort();
if(ans==-1)
printf("-1\n");
else
{
ans=0;
for(i=1;i<=n;++i)
ans+=reward[i];
printf("%d\n",ans);
}
}
return 0;
}