http://acm.hdu.edu.cn/showproblem.php?pid=2647
#include<vector>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=10000+5;
pair<int, int>e[maxn];//first:入度 second:工资(最低为0)
void toposort(vector<int> v[],const int n)
{
int flag=1,ans=0,t,cnt=0;
while(flag)
{
flag=0;
for(int i=1;i<=n;i++)
if(e[i].first==0)
{
flag=1;cnt++;
ans+=e[i].second;
e[i].first--;
for(int j=0;j<v[i].size();j++) //i->v[i][j],更新v[i][j]入度与工资
{
t=v[i][j];
e[t]=make_pair(e[t].first-1,max(e[i].second+1,e[t].second));
}
}
}
cout<<(cnt==n?ans+n*888:-1)<<endl;//i的最终工资:e[i]+888;
}
int main()
{
int n,m,a,b;
cin.sync_with_stdio(false);//好像用c++不加这个优化比加了快一点
while(cin>>n>>m)
{
vector<int>v[maxn];
memset(e,0,sizeof(e));
while(m--)
{
cin>>a>>b; //b->a
if(a!=b&&find(v[b].begin(),v[b].end(),a)==v[b].end())
e[a].first++,v[b].push_back(a);
}
toposort(v,n);
}
return 0;
}