【HDU 2647】Reward (邻接表实现拓扑排序,反向排序)
来源:互联网 发布:java 小游戏源代码 编辑:程序博客网 时间:2024/05/29 14:36
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.
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.
then m lines ,each line contains two integers a and b ,stands for a's reward should be more than b's.
2 11 22 21 22 1
1777-1
这道题不过不用邻接表会爆内存,这道题没必要一定可以进行排序,只要没有环就可以
wa了好多发就因为把不可以排序的情况也输出了-1
例如:
n = 3, m = 2;
1 2
1 3
显然这没法排序,但只要1的工资同时比2和3都低就可以按题意输出工资
而且反向排序可以简单的完成判断输出所需的最大工资
AC代码:
#include<iostream>#include<algorithm>#include<cstring>#include<cmath>#include<cstdio>#include<queue>#include<vector>using namespace std;const int MX = 10005;int n, m, tot, ind, sum, head[MX], IN[MX], mo[MX];struct Edge{ int v, nxt;}e[2 * MX];void add(int u, int v){ e[tot].v = v; e[tot].nxt = head[u]; head[u] = tot++; IN[v]++;}void init(){ memset(head, -1, sizeof(head)); memset(IN, 0, sizeof(IN)); tot = 0; ind = 0; sum = 0;}bool topo_sort(){ queue<int> q; for(int i = 1; i <= n; i++) { if(IN[i] == 0) q.push(i); } while(!q.empty()){ int v = q.front(); sum += mo[v]; q.pop(); ind++; for(int i = head[v]; ~i; i = e[i].nxt){ int u = e[i].v; IN[u]--; if(IN[u] == 0) { q.push(u); mo[u] = mo[v] + 1; } } } if(ind != n) { return false; } return true;}int main(){ int u, v; while(scanf("%d%d", &n, &m) != EOF){ init(); fill(mo, mo + n +1, 888); for(int i = 0; i < m; i++) { scanf("%d%d", &u, &v); add(v, u); } if(topo_sort()){ cout<<sum<<endl; } else cout<<-1<<endl; } return 0;}
阅读全文
0 0
- 【HDU 2647】Reward (邻接表实现拓扑排序,反向排序)
- hdu 2647 Reward(拓扑排序+邻接表)
- Reward 2647 (拓扑排序+邻接表)
- HDU-2647-Reward【拓扑排序】(反向排序)
- hdu 2647 Reward 拓扑排序+向前星邻接表
- Reward(拓扑排序+邻接表)
- HDOJ 2647 Reward (反向拓扑排序)
- HDU 2647 Reward(拓扑排序)
- hdu 2647 Reward (拓扑排序)
- hdu 2647 Reward ( 拓扑排序 )
- HDU 2647 - Reward(拓扑排序)
- hdu 2647 Reward (拓扑排序)
- HDU 2647Reward(拓扑排序)
- HDU 2647 Reward(图论-拓扑排序)
- HDU 2647 Reward(图论-拓扑排序)
- HDU 2647 Reward(拓扑排序)
- HDU 2647 -- Reward (拓扑排序)
- hdu 2647 Reward(拓扑排序)
- Redis的数据结构和使用场景介绍
- 洛谷P1055 ISBN号码
- android 常用控件(一)
- 剑指offer--不用加减乘除做加法
- PowerShell命令行,卸载WIN10自带应用
- 【HDU 2647】Reward (邻接表实现拓扑排序,反向排序)
- Spring Boot 学习笔记(-)
- python面向对象编程
- Eclipse 上传项目至github
- kernel的属性文件到android的java的读取(7 14)
- python编程技巧之从字典中提取子集
- 如何完全屏蔽Chrome的提示:"请停用以开发者模式运行的扩展程序"
- C++ Vector用法介绍
- JavaSE_笔试题_单选选择题1