题意:有n个房间和若干只老鼠(该题可直接当做一只处理),给定n值,以及每个房间来老鼠后下一个会去的房间号,还给了每个房间布置陷阱所需花的成本,求能让老鼠最终落网的布置陷阱的最小成本
本题需要用的数据结构就是基础的图论,用个next数组存下个邻接节点,然后在线存好数据后,我们需要注意,有n个节点也有n个边,那必然会有回路,其余是链的形式,我们用topo排序挨个去掉入度为0的链,剩余环(不可能剩多余链的),再用dfs统计最小值,即为ans
AC代码

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 2e5 + 20;
int n, m, cost[N], ans = 0, k, nex[N], du[N];
bool vis[N];void Topo(int x)
{vis[x] = true;du[nex[x]]--;if (!du[nex[x]]) Topo(nex[x]);
}int Dfs(int x)
{vis[x] = true;if (!vis[nex[x]]) return min(Dfs(nex[x]), cost[x]);else return cost[x];
}int main()
{cin >> n;for (int i = 1; i <= n; i++) cin >> cost[i];for (int i = 1; i <= n; i++) {int x; cin >> x;nex[i] = x, du[x]++;}for (int i = 1; i <= n; i++) if (!du[i] && !vis[i]) Topo(i);for (int i = 1; i <= n; i++) if (!vis[i]) ans += Dfs(i);cout << ans << endl;return 0;
}

本题用到了拓扑排序,特地上csdn简单学了一下,总结一下,记录一下

拓扑排序
一.定义:
对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若<u,v> ∈E(G),则u在线性序列中出现在v之前。
通常,这样的线性序列称为满足拓扑次序(Topological Order)的序列,简称拓扑序列。

拓扑排序就是把一个图的所有节点排序,使得每一条有向边(u,v)对应的u都排在v的前面。
拓扑排序的一个用途就是判断一个有向图是否有环。
性质:
1、拓扑排序在有向无环图中才能排出有效的序列,否则能判断该有向图有环。
2、如果输入的有向图中的点,不存在入度为0的点,则该有向图存在回路
3、如果存在的入度为0的点大于一个,则该有向图肯定不存在一个可以确定的拓扑序列但并不妨碍拓扑排序

拓扑排序还有一个重要的功能就是判断节点是一条链,还是在某个节点出现了分叉。
注意:
1)只有有向无环图才存在拓扑序列;
2)对于一个DAG,可能存在多个拓扑序列;


二.拓扑序列算法思想
(1)从有向图中选取一个没有前驱(即入度为0)的顶点,并输出之;
(2)从有向图中删去此顶点以及所有以它为尾的弧;
重复上述两步,直至图空,或者图不空但找不到无前驱的顶点为止。
三.代码实现:

采用邻接矩阵实现,mp[i][j]=0,表示节点i和j没有关联;mp[i][j]=1,表示存在边<i,j>,并且j的入度加1;

#include<iostream>
#include<stdlib.h>
#include<stdio.h>
#define MAX 100
#include<cstring>
using namespace std;
//n:关联的边数,m:节点数
void toposort(int mp[MAX][MAX],int indegree[MAX],int m)
{int i,j,k;printf("该DAG的拓扑序列为:");for(i=1;i<=m;i++) //遍历m次{for(j=1;j<=m;j++) //找出入度为0的节点{if(indegree[j]==0){indegree[j]--;cout<<j<<"  ";for(k=1;k<=m;k++) //删除与该节点关联的边{if(mp[j][k]==1){indegree[k]--;}}break;}}}
}
int main()
{int n,m; //n:关联的边数,m:节点数while(scanf("%d %d",&n,&m)==2&&n!=0){int i;int x,y;int mp[MAX][MAX]; //邻接矩阵int indegree[MAX]; //入度memset(mp,0,sizeof(mp));memset(indegree,0,sizeof(indegree));for(i=1;i<=n;i++){scanf("%d %d",&x,&y);if(!mp[x][y]){mp[x][y]=1;indegree[y]++;}}toposort(mp,indegree,m);}return 0;
}

CF1027D Mouse Hunt(topo总结)相关推荐

  1. 题解 CF1027D 【Mouse Hunt】

    这道题原本写了一个很复杂的DFS,然后陷入绝望的调试. 看了一下题解发现自己完全想复杂了. 这里大概就是补充一些题解没有详细解释的代码吧... (小声BB)现在最优解rank4(话说$O2$负优化什么 ...

  2. cf Educational Codeforces Round 49 D. Mouse Hunt

    原题: Medicine faculty of Berland State University has just finished their admission campaign. As usua ...

  3. 2.25-3.2 周记

    2.25-3.2 1. 计算几何 1.1 二维几何基础 struct Point{double x,y;Point(double x = 0, double y = 0):x(x),y(y){} } ...

  4. 安卓开发 高德地图定位的封装 十分钟上手

    前言 地图作为开发中三方sdk中较常遇到的一项,集成起来并不麻烦但是不小心踩坑可能会浪费较多时间,如果项目中多处使用还容易造成代码大量冗余,今天我们来将高德地图定位功能集成一个功能化模块,只需两分钟应 ...

  5. 吴恩达机器学习作业8(下)--- 推荐系统

    文章目录 代码分析 数据集 代码分析 导入数据 datafile = 'data/ex8_movies.mat' mat = scipy.io.loadmat( datafile ) Y = mat[ ...

  6. movie_recommendation_spark1

    mllib建立推荐模型 数据准备 数据包含在ml-100k的文件夹中,文件夹中比较重要的几个文件是u.user(用户属性数据集).u.item(电影元数据)和u.data(用户对电影的评分数据) (1 ...

  7. 斯坦福机器学习Coursera课程:第八次作业--推荐系统

    根据已有的1682部电影和943用户及部分用户对电影的评分数据,对新用户作电影推荐或预测未评价的评分. 一. 准备工作 1. 加载ex8_movies.mat数据 Y (1682*943) 用户评份数 ...

  8. 电影则选择以下几种类型的题材

    电影则选择以下几种类型的题材: 1.励志类电影:励志是少年成长时的积累和渴望,正因为有了渴望才拥有了腾飞的梦想,正因为有了积累才拥有了收获的喜悦.有时候一部经典影片,赋予你的却是无限的正能量.在这里没 ...

  9. java猫和老鼠_【进化史】猫和老鼠游戏进化史 Tom and Jerry Games 1989 - 2020

    https://youtu.be/7grgYL-Rp7M History Of Tom and Jerry Games 1989 to 2020 作者:M Pro Channel 1. Tom and ...

最新文章

  1. 后端程序员的前端工具
  2. 移动硬盘格式化了的资料找回方法
  3. visio 程序设计流程图合符号含义
  4. 查看网络端口使用情况
  5. bitcount方法详解_Java Long类的bitCount()方法和示例
  6. vs.php中使用apache或IIS7进行外部调试
  7. Docker基础学习笔记02:Docker基本操作
  8. (03)FPGA发展前景
  9. shell编程追加2
  10. 图形推理1000题及答案解析_判断推理图形推理——区分旋转翻转
  11. springboot 微服务_Spring Boot在微服务中的最佳实践
  12. HTML 学习笔记一
  13. 四川托普计算机职业学校教务管理系统,四川托普信息技术职业学院教务处
  14. MacBook Pro输入法的技巧你知多少
  15. 「白帽黑客成长记」Windows提权基本原理(上)
  16. 【gitee】解决gitee本地提交但是无法显示贡献度(绿点)的问题
  17. spfa - 黑暗城堡 - 一本通 3.1 例 1
  18. 深入浅出理解视频编码H.264结构
  19. PHP限制字符串显示长度
  20. angular如何生成条形码下载条形码

热门文章

  1. 职位名称: Java技术经理
  2. Android 框架MVP
  3. latex参考文献生成双语对照文献表
  4. CPU Machine Check Architecture Error Dump (CPU: Intel(R) Core(TM) i7-7700HQ CPU @ 2.80GHz, CPUID: 0x
  5. oauth2生成jwt令牌
  6. 白话机器学习-Encoder-Decoder框架
  7. Matlab中的mod()函数
  8. 在微信小游戏中使用tensorflow的face-landmarks-detection
  9. excel 显示 html代码,excel转成html显示
  10. Linux命令 - 覆盖 > 和 追加 >>