HDU2647Reward(拓扑排序)

Posted MangataTS

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU2647Reward(拓扑排序)相关的知识,希望对你有一定的参考价值。

题目链接

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

思路

我们将员工之间的关系作为边,从低工资指向高工资,然后我们跑一遍拓扑排序,再过程中我们通过pair<int,int> 存储每一个员工的idreward 因为奖励最低 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;

以上是关于HDU2647Reward(拓扑排序)的主要内容,如果未能解决你的问题,请参考以下文章

hdu 2647 Reward - 拓扑排序

HDU2647Reward(拓扑排序)

hdu 2647 Reward(拓扑排序+反图)

HDOJ 2647 Reward 逆拓扑排序+分层

Reward HDU - 2647

HDU 2647 Reward