设为首页 加入收藏

TOP

HDU 2647 Reward(图论-拓扑排序)
2015-07-20 17:59:59 来源: 作者: 【 】 浏览:2
Tags:HDU 2647 Reward 图论 拓扑 排序

Reward


Problem Description Dandelion's uncle is a boss of a factory. As the spring festival is coming , he wants to distribute rewards to his workers. Now he has a trouble about how to distribute the rewards.
The workers will compare their rewards ,and some one may have demands of the distributing of rewards ,just like a's reward should more than b's.Dandelion's unclue wants to fulfill all the demands, of course ,he wants to use the least money.Every work's reward will be at least 888 , because it's a lucky number.
Input One line with two integers n and m ,stands for the number of works and the number of demands .(n<=10000,m<=20000)
then m lines ,each line contains two integers a and b ,stands for a's reward should be more than b's.
Output For every case ,print the least money dandelion 's uncle needs to distribute .If it's impossible to fulfill all the works' demands ,print -1.
Sample Input
2 1
1 2
2 2
1 2
2 1

Sample Output
1777
-1

Author dandelion
Source 曾是惊鸿照影来
Recommend yifenfei

题目大意:

n个人,m条边,每条边a,b 表示a比b的工资要多,每个人的工资至少888,问满足关系的工资总和至少多少?如果出现关系矛盾,输出-1


解题思路:

根据工资关系建立拓扑图,0入度的人工资从888开始,一层一层,逐渐增加工资,若最后还有人入度不为0,则出现矛盾。


参考代码:

#include 
   
    
#include 
    
      #include 
     
       #include 
      
        using namespace std; const int MAXN = 10010; int inDegree[MAXN], ans, cnt, n, m; vector
       
         child[MAXN]; struct State { int reward, node; State(int _reward, int _node) : reward(_reward), node(_node) {} }; queue
        
          q; void init() { memset(inDegree, 0, sizeof(inDegree)); for (int i = 0; i <= n; i++) { child[i].clear(); } ans = cnt = 0; while (!q.empty()) q.pop(); } void input() { for (int i = 0; i < m; i++) { int a, b; cin >> a >> b; inDegree[a]++; child[b].push_back(a); } } void work() { for (int i = 1; i <= n; i++) { if (inDegree[i] == 0) { q.push(State(888, i)); cnt++; } } while (!q.empty()) { State cur = q.front(); q.pop(); ans += cur.reward; for (int i = 0; i < child[cur.node].size(); i++) { inDegree[child[cur.node][i]]--; if (inDegree[child[cur.node][i]] == 0) { q.push(State(cur.reward+1, child[cur.node][i])); cnt++; } } } } void output() { if (cnt == n) { cout << ans << endl; } else { cout << -1 << endl; } } int main() { ios::sync_with_stdio(false); while (cin >> n >> m) { init(); input(); work(); output(); } return 0; }
        
       
      
     
    
   


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇POJ - 3225 Help with Intervals .. 下一篇uva10130 - SuperSale(01背包)

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: