HDU2647Récompense (tri topologique)

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 888idreward8 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;
}

Je suppose que tu aimes

Origine blog.csdn.net/m0_46201544/article/details/123831552
conseillé
Classement