HDU 2647 Reward (拓扑排序)
2024-08-31 12:08:34
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2647
题意是给你n点m条有向边,叶子点(出度为0)上的值为888,父亲点为888+1,依次计算... 让你求最小的值,但是中间出现有向环就不行了,输出-1。
拓扑排序队列实现,因为叶子是最小的,所以把边反向就可以求了。
//拓扑队列实现
//就是先把入度为0的先入队,然后每次出队的时候把相邻的点的入度减1,要是入度为0则再入队,不断循环直到队列为空
//时间复杂度为O(N + E)
//这题就是把边反向就好了
#include <iostream>
#include <cstdio>
#include <queue>
#include <cstring>
#include <vector>
using namespace std;
const int MAXN = 1e4 + ;
typedef pair <int , int> P;
vector <int> G[MAXN];
int du[MAXN];
int main()
{
int n , m , u , v;
while(~scanf("%d %d" , &n , &m)) {
for(int i = ; i <= n ; i++) {
G[i].clear();
du[i] = ;
}
for(int i = ; i < m ; i++) {
scanf("%d %d" , &u , &v);
G[v].push_back(u);
du[u]++;
}
queue <P> que;
while(!que.empty()) {
que.pop();
}
int cont = , res = ;
for(int i = ; i <= n ; i++) {
if(!du[i]) {
que.push(P(i , ));
res += ;
cont++;
}
}
while(!que.empty()) {
P temp = que.front();
que.pop();
for(int i = ; i < G[temp.first].size() ; i++) {
du[G[temp.first][i]]--;
if(!du[G[temp.first][i]]) {
que.push(P(G[temp.first][i] , temp.second + ));
res += temp.second + ;
cont++;
}
}
}
if(cont == n) {
cout << res << endl;
}
else {
cout << - << endl;
}
}
}
最新文章
- C和指针 第十七章 习题
- Objective-C 关键字:retain, assgin, copy, readonly,atomic,nonatomic
- Java虚拟机JVM学习03 连接过程:验证、准备、解析
- eclipse启动无响应,停留在Loading workbench状态,或老是加载不了revert resources
- Mysql 如何删除数据表中的重复数据!
- Cent OS 常用 命令
- Android完美解决输入框EditText隐藏密码打勾显示密码问题
- poj 1458 Common Subsequence_最长公共子串
- Java的JXL操作xls形式
- freemarker之list遍历(八)
- C#中的函数式编程:序言(一)
- 在vue中使用echarts图表
- C语言基础02
- Typescript 学习笔记四:回忆ES5 中的类
- swift3.0 存取json数据到沙盒
- mybatis 中文做参数报错
- DevExpress v17.2新版亮点—Windows 10篇
- 前端之JavaScript(一)
- POJ 3974 Palindrome 字符串 Manacher算法
- MyBatis-Spring 使用总结
热门文章
- super.getClass()方法
- C#中跨线程读取控件值、设置控件值
- BZOJ_1628_[Usaco2007_Demo]_City_skyline_(单调栈)
- Nginx - webbench压力测试
- VirtualBox的工作原理&;参考网上文章
- 深入学习Oracle分区表及分区索引
- db file scattered read 等待事件
- Delphi DecodeDate和EncodeDate 拆分和聚合时间函数的用法
- MySQL基础之第11章 插入、更新与删除数据
- MyBatis学习 之 三、动态SQL语句