题目链接:​​http://acm.hdu.edu.cn/showproblem.php?pid=2647​​​
题意:让你给n个人发工资,然而这n个人心理都以一个预估,也就是某某应该比某某的工资高,基本工资是888,问你能否满足所有人的预估,如果能最少给多少工资
解析:反向建图,然后做拓扑排序,获得每个人的权重,最后权重和+n*888就是结果了

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e4+10;
vector<int>G[maxn];
int in[maxn];
int vis[maxn];
int main(void)
{
int n,m;
while(~scanf("%d %d",&n,&m))
{
for(int i=1;i<=n;i++)
G[i].clear();
memset(in,0,sizeof(in));
memset(vis,0,sizeof(vis));
for(int i=0;i<m;i++)
{
int x,y;
scanf("%d %d",&x,&y);
G[y].push_back(x);
in[x]++;
}
int cnt = 0;
queue<int>q;
for(int i=1;i<=n;i++)
{
if(in[i]==0)
q.push(i);
}
while(!q.empty())
{
int u = q.front();
q.pop();
cnt++;
for(int i=0;i<(int)G[u].size();i++)
{
int v = G[u][i];
in[v]--;
if(in[v]==0)
{
q.push(v);
vis[v] = max(vis[u]+1,vis[v]);
}
}
}
if(cnt!=n)
puts("-1");
else
{
int ans = n*888;
for(int i=1;i<=n;i++)
ans += vis[i];
printf("%d\n",ans);
}
}
return 0;
}
/*
5 4
1 2
2 4
1 3
3 5
*/