xdoj 1025

亮亮最近在玩一款叫做“梦想庄园”的经营游戏。在游戏中,你可以耕种,养羊甚至建造纺织厂。
如果你需要制造衣服,你首先得有布匹和毛线。布匹由棉花纺织而成;毛线由羊毛制成,而羊需要饲料才能长出羊毛,最终饲料由小麦和胡萝卜制成。
  假设游戏中共有N种物品,第i种物品由其他Ci个物品制成。亮亮需要你帮他制作M个任务物品来完成销售订单。
游戏中的每个物品都有一个价格Vi,当原材料不足以制作出所有的物品时,你需要花尽量少的钱买一些物品来完成任务。你可以选择直接购买所需的任务物品,也可以购买其他物品来制作任务物品,但是每制作一次需要W的代价。
 
题目分析:看着好吓人啊。。其实分析清晰也很简单。每种物体既可以直接买到或者由其他物体制作得到。那么我们就取两者的最小值。制作的花费我们可以这样求得
如果x的原材料有y 那么x和y之间有一条有向边 。然后按照拓扑排序的顺序自底而上求出各个物体制作所需的价值。。很简单吗?!
 #include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
const int N=1e4+;
vector < vector <int> > g(N);
int val[N];
bool vis[N];
int n,m,w;
void dfs (int rt) {
vis[rt]=;
if (g[rt].size()==) return ;// 最底层直接返回
int cost=w;
for (int i=;i<g[rt].size();i++) {
int next=g[rt][i];
if (!vis[next]) dfs(next);
cost+=val[next];//cost制作费用
}
val[rt]=min (cost,val[rt]);//取两者最小值
return ;
}
int main ()
{
int T;
scanf ("%d",&T);
while (T--) {
scanf ("%d %d %d",&n,&m,&w);
for (int i=;i<n;i++) g[i].clear();
memset (vis,,sizeof(vis));
for (int i=;i<n;i++) {
scanf ("%d",&val[i]);
int num; scanf ("%d",&num);
for (int j=;j<num;j++) {
int u; scanf ("%d",&u);
g[i].push_back(u);
}
}
for (int i=;i<n;i++)
if (!vis[i]) dfs (i);
int sum=;
for (int i=;i<m;i++) {
int x; scanf ("%d",&x);
sum+=val[x];
}
printf ("%d\n",sum);
}
return ;
}

ccf 高速公路 求联通分量 这个算法好像叫trajin 向这些科学家致敬

 #include <iostream>
#include <algorithm>
#include <cstdio>
#include <stack>
#include <vector>
using namespace std;
const int N=1e4+;
vector < vector <int> > g(N);
stack <int> ss;
bool instack[N];
bool vis[N];
int dfn[N],low[N];// dfn 保存遍历序号 low 这个点所能到达的最小点
int ans;
int n,m;
int cnt;//访问顺序
void dfs (int rt) {
vis[rt]=;
instack[rt]=; ss.push(rt);
dfn[rt]=low[rt]=++cnt;
for (int i=;i<g[rt].size();i++) {
int next=g[rt][i];
if (!vis[next]) {
dfs (next);
low[rt]=min (low[rt],low[next]);
}
else if (instack[next]) {
low[rt]=min (low[rt],low[next]);
}
}
if (dfn[rt]==low[rt]) {// dfn[rt]==low[rt] 表示遍历一个联通分变量啦
int num=;
int tmp=ss.top(); ss.pop(); instack[tmp]=;//在栈中 说明这个点的后继子孙还没有访问完
while (dfn[tmp]!=low[tmp]) { num++; tmp=ss.top(); ss.pop(); instack[tmp]=;}
ans+=(num-)*num/;
}
return ;
}
int main ()
{
ios::sync_with_stdio(false);
cin>>n>>m;
for (int i=;i<=m;i++) {
int x,y; cin>>x>>y;
g[x].push_back(y);
}
for (int i=;i<=n;i++)
if (!vis[i]) dfs (i);
printf ("%d\n",ans);
return ;
}
 

强大的dfs(用处1——拓扑排序【xdoj1025】,用处二——求强联通分量【ccf高速公路】)当然dfs用处多着咧的更多相关文章

  1. Vijos P1023Victoria的舞会3【贪心+DFS求强联通分量】

    链接:Click Me! P1023Victoria的舞会3 Accepted 标签:Victoria的舞会[显示标签] 描写叙述 Victoria是一位颇有成就的艺术家,他因油画作品<我爱北京 ...

  2. CodeForces 1213F (强联通分量分解+拓扑排序)

    传送门 •题意 给你两个数组 p,q ,分别存放 1~n 的某个全排列: 让你根据这两个数组构造一个字符串 S,要求: (1)$\forall i \in [1,n-1],S_{pi}\leq S _ ...

  3. 【DFS】【拓扑排序】【动态规划】Gym - 100642A - Babs' Box Boutique

    给你10个箱子,有长宽高,每个箱子你可以决定哪个面朝上摆.把它们摞在一起,边必须平行,上面的不能突出来,问你最多摆几个箱子. 3^10枚举箱子用哪个面.然后按长为第一关键字,宽为第二关键字,从大到小排 ...

  4. hihoCoder #1185 : 连通性·三(强联通分量+拓扑排序)

    #1185 : 连通性·三 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 暑假到了!!小Hi和小Ho为了体验生活,来到了住在大草原的约翰家.今天一大早,约翰因为有事要出 ...

  5. 拓扑排序详解(梅开二度之dfs版按字典序输出拓扑路径+dfs版输出全部拓扑路径

    什么是拓扑排序? 先穿袜子再穿鞋,先当孙子再当爷.这就是拓扑排序! 拓扑排序说白了其实不太算是一种排序算法,但又像是一种排序(我是不是说了个废话qwq) 他其实是一个有向无环图(DAG, Direct ...

  6. uvaLA4255 Guess BFS+拓扑排序

    算法指南白书 思路:“连续和转化成前缀和之差” #include <stdio.h> #include <string.h> #include <iostream> ...

  7. Poj 3683-Priest John's Busiest Day 2-sat,拓扑排序

    Priest John's Busiest Day Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 8872   Accept ...

  8. Legal or Not(拓扑排序判环)

    http://acm.hdu.edu.cn/showproblem.php?pid=3342 Legal or Not Time Limit: 2000/1000 MS (Java/Others)   ...

  9. CF798E. Mike and code of a permutation [拓扑排序 线段树]

    CF798E. Mike and code of a permutation 题意: 排列p,编码了一个序列a.对于每个i,找到第一个\(p_j > p_i\)并且未被标记的j,标记这个j并\( ...

随机推荐

  1. Spring生态顶级项目说明

    1.Spring IO platform 说明:用于系统部署,是可集成的,构建现代化应用的版本平台 2.Spring Boot 说明:旨在简化创建产品级的 Spring 应用和服务,简化了配置文件,使 ...

  2. InChat版,仅仅两个接口实现自己的IM系统(可兼容)

    InChat 一个IM通讯框架 一个轻量级.高效率的支持多端(应用与硬件Iot)的异步网络应用通讯框架.(核心底层Netty) 版本目标:完成基本的消息通讯(仅支持文本消息),离线消息存储,历史消息查 ...

  3. Codeforces 912E - Prime Gift

    912E - Prime Gift 思路: 折半枚举+二分check 将素数分成两个集合(最好按奇偶位置来,保证两集合个数相近),这样每个集合枚举出来的小于1e18的积个数小于1e6. 然后二分答案, ...

  4. 2017"百度之星"程序设计大赛 - 资格赛-度度熊与邪恶大魔王(dp+后缀最小值)

    度度熊与邪恶大魔王 思路:由于防御和血量的范围很小,所以暴力枚举出对于每种防御造成的每种伤害所需的最小花费,最后只需在伤害大于等于血量的情况下再找到最小花费(这个只需要后缀最小值预处理一下就可以了) ...

  5. robotframework安装与配置--学习第一天

    刚刚入职公司,之前学的是Java+selenium自动化测试,但公司要求使用robot framework,所以找了些资料学习.刚开始觉得为什么不用java.python等开发语言+selenium做 ...

  6. 170301、使用Spring AOP实现MySQL数据库读写分离案例分析

    使用Spring AOP实现MySQL数据库读写分离案例分析 原创 2016-12-29 徐刘根 Java后端技术 一.前言 分布式环境下数据库的读写分离策略是解决数据库读写性能瓶颈的一个关键解决方案 ...

  7. Vim:replace with foobar (y/n/a/q/l/^E/^Y)?

    y:to substitute this match n:to skip this match a:to substitute this and all remaining matches q:to ...

  8. sqlite 查询数据库中所有的表名,判断某表是否存在,将某列所有数值去重后获得数量

    1.列出当前db文件中所有的表的表名 SQL语句:SELECT * FROM sqlite_master WHERE type='table'; 结构如下: 注:网上有人说可以带上db文件的名称,如: ...

  9. SSH key的烦恼

    ssh key即公钥.私钥对,使用这种方式比较安全也比较方便,可以不用输入用户名.密码. 配置步骤: 1.生成ssh key: ssh-keygen -t rsa -C "bjhuxiaol ...

  10. HDU 4802 && HDU 4803 贪心,高精 && HDU 4804 轮廓线dp && HDU 4805 计算几何 && HDU 4811 (13南京区域赛现场赛 题目重演A,B,C,D,J)

    A.GPA(HDU4802): 给你一些字符串对应的权重,求加权平均,如果是N,P不计入统计 GPA Time Limit: 2000/1000 MS (Java/Others)    Memory ...