这个题如果用邻接矩阵的话,由于n比较大,会超内存,所以选用邻接表的形式。还有就是这个题有那个等级的问题,一级比一级的福利高,所以不能直接拓扑排序,而是反过来,计算出度,找出度为0的顶点,然后更新出度数组,等级更新的时候要判断是否比原来的等级大,具体看代码

 /*************************************************************************
> File Name: hdu_1647.cpp
> Author:
> Mail:
> Created Time: 2015年03月28日 星期六 16时18分47秒
************************************************************************/ #include<iostream>
#include <cstdio>
#include <cstring>
#include <stdlib.h>
using namespace std;
const int N = ;
int OutDegree[N];//出度
struct Node{//邻接表
int start;
struct Node *next;
};
Node *node[N];
int n, m, ans;
int level[N];//等级
bool Topo()
{
int cnt = ;//统计个数
for (int i = ; i <= n; i++)
{
for (int j = ; j <= n; j++)
{
if (OutDegree[j] == )//找到出度为0的顶点
{
cnt++;
OutDegree[j]--;
ans += level[j] + ;
Node *tmp = node[j]->next;
while (tmp != NULL)//将所有跟他有关的边去掉
{
OutDegree[tmp->start]--;
level[tmp->start] = max(level[tmp->start], level[j] + );//比较等级之间的关系,取较大的那个
tmp = tmp->next;
}
}
}
}
if (cnt == n)//判断是否存在环
return true;
return false;
}
int main()
{
while (~scanf("%d %d", &n, &m))
{
ans = ;
int a, b;
memset(level, , sizeof(level));
memset(OutDegree, , sizeof(OutDegree));
for (int i = ; i <= n; i++)//初始化
{
node[i] = (Node *)malloc(sizeof(Node));
node[i]->start = ;
node[i]->next = NULL;
} for (int i = ; i < m; i++)
{
scanf("%d %d", &a, &b);
OutDegree[a]++;
Node *tmp = node[b];
while (tmp->next != NULL)
tmp = tmp->next;
Node *new_node = (Node *)malloc(sizeof(Node));
new_node->start = a;
new_node->next = NULL;
tmp->next = new_node;
}
if (Topo())
printf("%d\n", ans);
else
puts("-1");
for (int i = ; i <= n; i++)
free(node[i]);
} return ;
}

逆拓扑排序 HDU2647Reward的更多相关文章

  1. Leetcode207--->课程表(逆拓扑排序)

    题目: 课程表,有n个课程,[0, n-1]:在修一个课程前,有可能要修前导课程: 举例: 2, [[1,0]] 修课程1前需要先修课程0 There are a total of 2 courses ...

  2. HDOJ 2647 Reward 【逆拓扑排序+分层】

    题意:每一个人的基础工资是888. 因为一部分人要显示自己水平比較高,要求发的工资要比其它人中的一个人多.问你能不能满足他们的要求,假设能的话终于一共要发多少钱,假设不能就输出-1. 策略:拓扑排序. ...

  3. 逆拓扑排序 Reward HDU - 2647

    Reward HDU - 2647 题意:每个人的起始金额是888,有些人觉得自己做的比另一个人好所以应该多得一些钱,问最少需要花多少钱,如果不能满足所有员工的要求,输出 -1 样例1: 2 1 1 ...

  4. 拓扑排序 --- hdu 4948 : Kingdom

    Kingdom Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Sub ...

  5. hdu2647 逆拓扑,链式前向星。

    pid=2647">原文地址 题目分析 题意 老板发工资,可是要保证发的工资数满足每一个人的期望,比方A期望工资大于B,仅仅需比B多1元钱就可以.老板发的最低工资为888元.输出老板最 ...

  6. POJ3687.Labeling Balls 拓扑排序

    Labeling Balls Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 13201 Accepted: 3811 Descr ...

  7. PKU 3687 Labeling Balls(拓扑排序)

    题目大意:原题链接 给出N个未编号的质量各不相同的球,以及它们质量轻重的大小关系,给它们从1-N贴标签编号,无重复.问是否存在可行的编号方法,不存在输出-1, 如果存在则输出唯一一种方案,此方案是使得 ...

  8. HDU2647-Reward(拓扑排序)

    Reward Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

  9. POJ3687 Labeling Balls(拓扑排序\贪心+Floyd)

    题目是要给n个重量1到n的球编号,有一些约束条件:编号A的球重量要小于编号B的重量,最后就是要输出字典序最小的从1到n各个编号的球的重量. 正向拓扑排序,取最小编号给最小编号是不行的,不举出个例子真的 ...

随机推荐

  1. 【USACO 3.2.2】二进制数01串

    [描述] 考虑排好序的N(N<=31)位二进制数. 你会发现,这很有趣.因为他们是排列好的,而且包含所有可能的长度为N且含有1的个数小于等于L(L<=N)的数. 你的任务是输出第I(1&l ...

  2. jquery ajax(5)form表单序列化

    form表单序列化<script type="text/javascript"> $(function(){ $("#send").click(fu ...

  3. 死亡的协议--- Pieter Hintjens (ZeroMQ作者)

    过去几年中用zeromq写过几个系统系统.对ZeroMQ强大和灵活印象非常深刻.在阅读zeromq guide文档时候.发现作者整理各种通信模式非常经典和实用,可以作为分布式通信的教科书来看.第一次见 ...

  4. Scut:通用配置管理器

    1. 配置节 ConfigSection private List<ConfigNode> _configNodes; public class ConfigNode { public C ...

  5. 改进基于Boost.Asio的聊天服务

    Boost.Asio是个非常易用的C++异步网络库,官方文档中一个示例是聊天服务,分为chat_message.chat_client.chat_server三个部分.chat_server的启动代码 ...

  6. HDU 4421 Bit Magic(奇葩式解法)

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=4421 题目大意: 给了你一段代码, 用一个数组的数 对其进行那段代码的处理,是可以得到一个矩阵 让你判 ...

  7. 【转】vim 修改tab为四个空格

    原文网址:http://blog.sina.com.cn/s/blog_620ccfbf01010erz.html 为了vim更好的支持python写代码,修改tab默认4个空格有两种设置方法: 1. ...

  8. word页面不对齐,如何解决?

    http://blog.163.com/haibianfeng_yr/blog/static/34572620201157105439516/

  9. Binary Search Tree Iterator——LeetCode

    Implement an iterator over a binary search tree (BST). Your iterator will be initialized with the ro ...

  10. JAVA中的Transient

    Java中的transient,是用于声明序列化的时候不被存储的. 例子: package ThreadTest; /** * Created with IntelliJ IDEA. * User: ...