HDU2647Reward (clasificación topológica)

enlace de tema

http://acm.hdu.edu.cn/showproblem.php?pid=2647

ideas

Usamos la relación entre los empleados como ventaja, de salario bajo a salario alto, y luego ejecutamos la clasificación topológica, y en el proceso almacenamos la suma pair<int,int>de cada empleado porque la recompensa es la más baja 888 888idreward8 8 8 por lo que nuestro grado de entrada es0 0El salario de 0 puntos es 888 8888 8 8 Después de cada empuje, el salario aumentará en uno, y finalmente agregaremos estennLos salarios de n empleados se pueden calcular

código

#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;
}

Supongo que te gusta

Origin blog.csdn.net/m0_46201544/article/details/123831552
Recomendado
Clasificación