【深度优先搜索】MZOJ_1344工作依赖
这道题的读入非常毒瘤。。。恶心到我了
我痛苦地弄了很久,还是被卡住了我还真是▇了狗了。[传送门](特此声明:学校内部OJ,需登录)
题目描述(Description):
2008年,奥运会将在中国举行。众所周知举办奥运会是一个庞大的工程,有许多准备工作要做,而这些工作也是要分先后、存在依赖关系的。比如我们说工作2依赖于工作1,意思是说在工作2开始做之前要必须结束工作1。我们假设,在一个时刻只有一个工作在进行,而且每样工作所依赖的其它工作不会超过10个。
输入文件(job.in):
第一行有两个整数N(0<=N<=10000)和M。所有工作从1到N编号。你需要计算第M个工作的最早结束时间。
接下来N行每行描述一个工作,第1行描述工作1,第二行描述工作2,……,以此类推。每行包含几个正整数,第i行的第1个整数是完成第i个工作需要的时间T(0<T<=100),第i行的其余数字是第i个工作所依赖的其它工作编号。我们保证不会出现循环依赖。
输出文件(job.out):
一个整数:工作M的最早结束时间。
样例(Sample):
Sample Input Case 1:
2 2
3
2 1
Sample Output Case 1:
5
Sample Input Case 2:
3 3
3
2 1
4 1 2
Sample Output Case 2:
9
这一道题是没有太大的思维难度的,只需要两个东西:1.建立好关系 2.读入!!!
有的dalao是用的BFS做的,这里是他的文章(应该是个学长吧,不认识。。)[你点我呀_(:3 」∠)_]
然而作为一个蒟蒻我觉得BFS太难推了,就果断选择了DFS。。
DFS的思路很简单:
首先我们需要存边。但是我们大部分人都会第一眼可能都是这样的:
若u依赖于v,则应建立一条v到u的有向边。
其实这样存边也可以,但是非常麻烦。因为我们要维护出m节点入边个数。我绝对不会告诉你我考试这样想了半个小时
那如果反向思考呢?如果我们建立一条从u到v的有向边。为什么这样更好?因为图的遍历在正常情况下所有以自己为起点的边总会遍历完。完全不需要考虑其他东西。
如果你硬是要按照黄字来建我又有什么办法,jpg
存图的思路若是建立好,开始遍历就很简单。
如果访问过的节点就不再访问。
先上一波伪代码:
DFS(cur)
{
ans+=t[cur];
cur is visted;
for(each edge (cur,v) from cur)
if(v is not visted)
DFS(v);
}
想必诸位看到了递归的好处了:简洁又很有说服力。
但是。。。其实我最主要死在了读入上面。。。。。
出这个毒瘤读入的老师开心地笑了
我先放几波死了的读入(电视机前的小朋友们请勿模仿)
死亡读入1:
scanf("%d%d",&n,&m);
for(int i=;i<=n;++i)
{
int a=;
scanf("%d",t+i);
while(scanf("%d",&a)==)
{
g[i].push_back(a);
}
else continue;
}
死亡读入2:
scanf("%d%d",&n,&m);
for(int i=;i<=n;++i)
{
int a=;
scanf("%d",t+i);
if(char ch=getchar()!='\n')
while(scanf("%d",&a)==)
{
g[i].push_back(a);
}
else continue;
}
......(不一一枚举了)
读入虐我千百遍我待读入如初恋
又尤其是Dev-cpp这个东西它在调试的时候死活不给我往下走(经验实是因为Dev对STL容器兼容性不好,然而我用了vector),我Alt+N都要按烂了。搞的我每次调的时候都要注释,再看看输入正确没有。
我百思不得其解时,看到了大佬的代码,大佬是在读入时读入的字符串,再作计算。
我就借助这个思路同样用字符串去读,就完全OK。
(这是我第一次用vector,原因是我觉得不存边权的边用vector写起来舒服)
下附AC代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<vector>
#define MAXN 10000+5
using namespace std;
//---------------
vector<int>g[MAXN];
typedef char String[];
int n,m;
int ans=;
bool vis[MAXN];
int t[MAXN];
void dfs(int cur)
{
//cout<<"当前节点:"<<cur<<endl;
ans+=t[cur];
//cout<<"ans="<<ans<<endl;
vis[cur]=true;
for(int i=;i<g[cur].size();++i)
{
int v=g[cur][i];
if(!vis[v])/*cout<<"到v节点"<<v<<endl,*/dfs(v);//如果没有走 则一定要走他
}
}
String s;
int main()
{
int a;
//freopen("input.txt","r",stdin);
scanf("%d%d",&n,&m);
for(int i=;i<=n;++i)
{
a=;
scanf("%d",t+i);
char ch=getchar();
if(ch=='\n') continue;
else{
gets(s);
int LEN=strlen(s);
for(int j=;j<LEN;++j)
{
if(s[j]>='' && s[j]<=''){a=a*+s[j]-'';}
if(s[j]==' ' || s[j+]=='\0'){g[i].push_back(a);a=;}
}
}
}
dfs(m);
printf("%d\n",ans);
return ;
}
所以后排%%%大佬们~
【深度优先搜索】MZOJ_1344工作依赖的更多相关文章
- 广度优先(bfs)和深度优先搜索(dfs)的应用实例
广度优先搜索应用举例:计算网络跳数 图结构在解决许多网络相关的问题时直到了重要的作用. 比如,用来确定在互联网中从一个结点到另一个结点(一个网络到其他网络的网关)的最佳路径.一种建模方法是采用无向图, ...
- Leetcode之深度优先搜索(DFS)专题-733. 图像渲染(Flood Fill)
Leetcode之深度优先搜索(DFS)专题-733. 图像渲染(Flood Fill) 深度优先搜索的解题详细介绍,点击 有一幅以二维整数数组表示的图画,每一个整数表示该图画的像素值大小,数值在 0 ...
- 深度优先搜索(DFS)思路及算法分析
1.算法用途: 用于遍历图中的节点,有些类似于树的深度优先遍历.这里唯一的问题是,与树不同,图形可能包含循环,因此我们可能会再次来到同一节点. 2.主要思想: 借用一个邻接表和布尔类型数组(判断一个点 ...
- 深度优先搜索理论基础与实践(java)
概论 深度优先搜索属于图算法的一种,是一个针对图和树的遍历算法,英文缩写为 DFS 即 Depth First Search.深度优先搜索是图论中的经典算法,利用深度优先搜索算法可以产生目标图的相应拓 ...
- 【数据结构与算法Python版学习笔记】图——骑士周游问题 深度优先搜索
骑士周游问题 概念 在一个国际象棋棋盘上, 一个棋子"马"(骑士) , 按照"马走日"的规则, 从一个格子出发, 要走遍所有棋盘格恰好一次.把一个这样的走棋序列 ...
- 深度优先搜索(DFS)
[算法入门] 郭志伟@SYSU:raphealguo(at)qq.com 2012/05/12 1.前言 深度优先搜索(缩写DFS)有点类似广度优先搜索,也是对一个连通图进行遍历的算法.它的思想是从一 ...
- 初涉深度优先搜索--Java学习笔记(二)
版权声明: 本文由Faye_Zuo发布于http://www.cnblogs.com/zuofeiyi/, 本文可以被全部的转载或者部分使用,但请注明出处. 上周学习了数组和链表,有点基础了解以后,这 ...
- 挑战程序2.1.4 穷竭搜索>>深度优先搜索
深度优先搜索DFS,从最开始状态出发,遍历一种状态到底,再回溯搜索第二种. 题目:POJ2386 思路:(⊙v⊙)嗯 和例题同理啊,从@开始,搜索到所有可以走到的地方,把那里改为一个值(@或者 ...
- 回溯 DFS 深度优先搜索[待更新]
首先申明,本文根据微博博友 @JC向北 微博日志 整理得到,本文在这转载已经受作者授权! 1.概念 回溯算法 就是 如果这个节点不满足条件 (比如说已经被访问过了),就回到上一个节点尝试别 ...
随机推荐
- Linu下的Mysql学习详解_【all】
Linux下Mysql简介 1.什么是Mysql(MariDB) 1.数据库:存储数据的仓库 2.关系型数据库:mysql(主流用5.5,5.6), oracle 本质:二维表 ...
- Windows as a Service(1)—— Windows 10服务分支
前言 作为公司的IT管理员,管理全公司Windows 10操作系统的更新一直是工作中的头疼之处.微软提供了很多方法来帮助我们管理公司的Windows 10更新,比如Windows Server Upd ...
- 安装kubernetes 环境
master: 10.6.2.170 #master节点兼做仓库 node-1: 10.6.2.171 node-2: 10.6.2.172 1.添加host解析 # cat << ...
- C#网络编程(一)基础篇
简介: C#网络编程API包含在System.Net和System.Net.Sockets命名空间下,大部分网络操作都可以在其中找到相应的类来实现:包括Socket的创建和连接,网络流收发方法的封装, ...
- Hdfs&MapReduce测试
Hdfs&MapReduce测试 测试 上传文件到hdfs 随意打开一个文件夹传一个文件试试(把javafx-src.zip传到hdfs的/根目录下):hadoop fs -put javaf ...
- Input and Output-The input is all the sources of action for your app
Programs take input and produce output. The output is the result of doing something with the input. ...
- 死磕salt系列-salt 故障汇总
这里将salt使用过程中遇到的所有的故障进行一个汇总. grains 匹配后多了一个列表 salt-master中配置jinja模板来匹配自定义的grins. vim /etc/salt/minion ...
- P1081 开车旅行
题目描述 小 A 和小 B 决定利用假期外出旅行,他们将想去的城市从 1 到 N 编号,且编号较小的 城市在编号较大的城市的西边,已知各个城市的海拔高度互不相同,记城市 i 的海拔高度为 Hi,城市 ...
- 随手练——O(n)解决无序数组排序后的相邻最大差值
题目从这儿看到的 : https://mp.weixin.qq.com/s/2OXg67MfBuQjDPAJxxD8rQ,但是公众号上讲错了,问题还挺严重的. 题目知识点:桶排序. 题目:有一个无序数 ...
- 【Oracle123】向OracleDB导入*.csv文件数据
SQL*Loader Control File Reference https://docs.oracle.com/cd/B10501_01/server.920/a96652/ch05.htm Or ...