这个题如果用邻接矩阵的话,由于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. 跟我学android-使用Eclipse开发第一个Android应用(三)

    打开Eclipse,选择 File—New –Android Application Project Application Name  就是我们的 应用名称,也是我们在手机应用程序列表里看到的名称. ...

  2. 理解线程的挂起,sleep还有阻塞

    线程是靠cpu来运行的,cpu要运行一个线程(不说别的)最起码就是要占用cpu时间,象Windows这样的多任务操作系统,可以允许多个线程同时运行,所谓的同时运行并不是真正的同时运行,而是轮流运行不同 ...

  3. js 得到当前季度

    Date.prototype.getQuarter = function() { var month = this.getMonth(); if(month < 3) { return '第一季 ...

  4. 在iframe里调用parent.func()引出的js函数运行在它们被定义的作用域里,而不是它们被执行的作用域里

    有个document里定义了一个函数func(),同时在document里嵌入了一个iframe,在这个iframe里调用父窗口的方法:parent.func(),本来我以为这个函数的运行环境是在这个 ...

  5. js学习笔记之:时间(三)

    今天来学习一个简单的时间应用:时间的倒影,如图所示:   主要知识点: 1  获取系统的时间值:2 建立一个div的倒影 div的倒影主要利用css来控制,函数值为:filter:flipv() 步骤 ...

  6. [Git]Git安装

    1.什么是Git Git是一个分布式版本控制/软件配置管理软件, git是用于Linux内核开发的版本控制工具, 与CVS.Subversion一类的集中式版本控制工具不同,它采用了分布式版本库的作法 ...

  7. js在html中的加载执行顺序

    1.加载顺序:引入标记<script />的出现顺序,依次加载 页面上的Javascript代码是HTML文档的一部分,所以Javascript在页面装载时执行的顺序就是其引入标记< ...

  8. python ATM购物程序

    需求: 模拟实现一个ATM + 购物商城程序 额度 15000或自定义 实现购物商城,买东西加入 购物车,调用信用卡接口结账 可以提现,手续费5% 每月22号出账单,每月10号为还款日,过期未还,按欠 ...

  9. JS小技巧大本事(持续更新)

    1. 复制N个字符 String.prototype.repeat = function(num){ return (new Array(++num)).join(this); } var a = ' ...

  10. oracle中字符串的大小比较,字符串与数字的比较和运算

    Oracle比较字符串是根据ASCII码来的,第一个字母的ASCII大小比较如果相等再比较下一个,类推.字符串和数字进行操作是会报异常的,因为类型不一样不能进行比较. Oracle在执行SQL的时候有 ...