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. 在每个节点填充向右的指针 Populating Next Right Pointers in Each Node

    2018-08-09 16:01:40 一.Populating Next Right Pointers in Each Node 问题描述: 问题求解: 由于是满二叉树,所以很好填充. public ...

  2. org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): 问题解决方法

    在用maven配置mybatis环境时出现此BindingExceptiony异常,发现在classes文件下没有mapper配置文件,应该是maven项目没有扫描到mapper包下的xml文件,在p ...

  3. 介绍 Jersey 依赖

    Jersey 使用 Apache Maven 进行构造和安装.非快照(Non-snapshot)Jersey 发行版本是不会部署到 中心 Maven 仓库(Central Maven Reposito ...

  4. Confluence 6 LDAP 连接池配置参数

    初始连接池大小(Initial Pool Size) 当初始化 LDAP 连接池的时候初始化创建的 LDAP 连接数量. 1 期望的连接池大小(Preferred Pool Size) 优化连接池的大 ...

  5. Gluttony CodeForces - 892D (构造,思维)

    题面: You are given an array a with n distinct integers. Construct an array b by permuting a such that ...

  6. 用DFS 解决全排列问题的思想详解

    首先考虑一道奥数题目: □□□ + □□□ = □□□,要将数字1~9分别填入9个□中,使得等式成立.例如173+286 = 459.请输出所有合理的组合的个数. 我们或许可以枚举每一位上所有的数,然 ...

  7. How do you add?(递推)

    题意:求将n分为k个数相加的种数. 如:n=20,k=2,则可分为: 0+20=20 1+19=20 2+18=20 ....... 20 +0=20 共21种方案. 解析:令f(n,m)表示将n分为 ...

  8. 隔离级别 && SNAPSHOT

    read uncommitted | 0 未提交读 将查询的隔离级别指定为 0. 可以读脏数据. 读脏数据:一事务对数据进行了增删改,但未提交,有可能回滚,另一事务却读取了未提交的数据.   例: 公 ...

  9. spring--boot @Valid的使用

    spring--boot @Valid的使用 每天一个小知识点,每天进步一点点,总结是积累. springBoot @Valid的使用,解释一下.就是给摸个bean类属性(数据库字段)加一个门槛,比如 ...

  10. 疑难en_a

    1◆ a   æ eɪ ʌ ɑː ə