lien du sujet
http://acm.hdu.edu.cn/showproblem.php?pid=2647
des idées
Nous utilisons la relation entre les employés comme avantage, du bas salaire au haut salaire, puis nous effectuons un tri topologique, et dans le processus nous stockons la somme pair<int,int>
de chaque employé car la récompense est la plus basse 888 888id
reward
8 8 8 donc notre degré est0 00 point salaire est888 8888 8 8 Après chaque poussée, le salaire augmentera de un, et finalement nous ajouterons cennLes salaires de n employés peuvent être calculés
code
#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;
}