题目链接
http://acm.hdu.edu.cn/showproblem.php?pid=2647
思路
我们将员工之间的关系作为边,从低工资指向高工资,然后我们跑一遍拓扑排序,再过程中我们通过pair<int,int>
存储每一个员工的id
和reward
因为奖励最低 888 888 888 于是我们入度为 0 0 0 的点的工资就是 888 888 888 往后每推一层工资加一,最后我们将这 n n n 个员工的工资统计起来即可
代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define mod 1000000007
#define endl "\n"
#define PII pair<int,int>
#define INF 0x3f3f3f3f
const int N = 1e4+10;
int n,m;
int du[N];
vector<int> E[N];
void topsort(){
vector<int> ans;
queue<PII> que;
for(int i = 1;i <= n; ++i)
if(!du[i]) que.push({
i,888});
while(!que.empty()){
int t = que.front().first;
int k = que.front().second;
que.pop();
ans.push_back(k);
for(int i = 0,l = E[t].size();i < l; ++i) {
int v = E[t][i];
du[v]--;
if(!du[v]) que.push({
v,k+1});
}
}
if(ans.size() != n) cout<<-1<<endl;
else{
int res = 0;
for(int i = 0;i < n; ++i) res += ans[i];
cout<<res<<endl;
}
}
signed main()
{
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
while(cin>>n>>m){
for(int i = 0;i <= n; ++i)
E[i].clear(),du[i] = 0;
int u,v;
for(int i = 1;i <= m; ++i) {
cin>>u>>v;
du[u]++;
E[v].push_back(u);
}
topsort();
}
return 0;
}