题目:
http://acm.hdu.edu.cn/showproblem.php?pid=2647
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<string>
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
int n,m,a,b;
int num[10010];
vector<int>e[10010];
int ans;
int ts[10010];
bool tupo()
{
queue<int>q;
int kind=0;
for(int i=1;i<=n;i++)
if(num[i]==0){
kind++;
q.push(i);
}
while(q.size())
{
int tp=q.front();q.pop();
ans+=ts[tp];
for(int i=0;i<e[tp].size();i++)
{
int next=e[tp][i];
// cout<<next<<endl;
num[next]--;
ts[next]=max(ts[next],ts[tp]+1);
if(num[next]==0) {
q.push(next);
kind++;
}
}
}
// cout<<ans<<endl;
if(kind==n) return 1;
else return 0;
}
int main()
{
// freopen("in.in","r",stdin);
while(~scanf("%d%d",&n,&m)&&n+m)
{
memset(num,0,sizeof(num));
memset(ts,0,sizeof(ts));
for(int i=1;i<=n;i++) e[i].clear();
while(m--)
{
scanf("%d%d",&b,&a);
num[b]++;
e[a].push_back(b);
}
ans=0;
if(tupo()) printf("%d\n",n*888+ans);
else printf("-1\n");
}
return 0;
}