【拓扑排序】HDU 2647 Reward【2012/3/25更新】

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

[size=medium][b]题意:先给出人数n和关系数m,再给出工人之间的工资大小关系,例如给出a b表示a>b,求老板至少要给多少工资【注:工人至少有888元的工资】[/b]

[b][color=blue]Sample Input[/color]
[color=red]2 1[/color]
1 2
[color=red]2 2[/color]
1 2
2 1
[color=red]6 5[/color]
2 4
3 6
3 5
1 2
1 3
[color=red]4 3[/color]
1 2
3 4
2 3

[color=blue]Sample Output[/color]
1777
-1
5532
3558[/b][/size]


#include <iostream>
#include <queue>
using namespace std;
#define M 10005

struct edge{
int v, w, nxt;
}e[20005];

int ind[M], p[M], cnt, money[M], n;

void init ()
{
cnt = 0;
memset (p, -1, sizeof(p));
memset (ind, 0, sizeof(ind));
for (int i = 1; i <= n; i++) money[i] = 888;
}

void addedge (int u, int v)
{
e[cnt].v = v, e[cnt].nxt = p[u], p[u] = cnt++;
}

int main()
{
int m, u, v, i, num, ans = 0;
while (~scanf ("%d%d", &n, &m))
{
init ();
while (m--)
{
scanf ("%d%d", &u, &v);
addedge (v, u); //逆向思维
ind[u]++;
}
queue<int> q;
for (i = 1; i <= n; i++)
if (ind[i] == 0)
q.push (i);
num = ans = 0;
while (!q.empty())
{
u = q.front();
q.pop();
ans += money[u]; //累加确定工资
num++;
for (i = p[u]; i != -1; i = e[i].nxt)
{
if (--ind[e[i].v] == 0)
{
money[e[i].v] = money[u] + 1;
q.push (e[i].v);
}
}
}
if (num < n) ans = -1;
printf ("%d\n", ans);
}
return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值