这道题的读入非常毒瘤。。。恶心到我了

我痛苦地弄了很久,还是被卡住了我还真是▇了狗了。[传送门](特此声明:学校内部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工作依赖的更多相关文章

  1. 广度优先(bfs)和深度优先搜索(dfs)的应用实例

    广度优先搜索应用举例:计算网络跳数 图结构在解决许多网络相关的问题时直到了重要的作用. 比如,用来确定在互联网中从一个结点到另一个结点(一个网络到其他网络的网关)的最佳路径.一种建模方法是采用无向图, ...

  2. Leetcode之深度优先搜索(DFS)专题-733. 图像渲染(Flood Fill)

    Leetcode之深度优先搜索(DFS)专题-733. 图像渲染(Flood Fill) 深度优先搜索的解题详细介绍,点击 有一幅以二维整数数组表示的图画,每一个整数表示该图画的像素值大小,数值在 0 ...

  3. 深度优先搜索(DFS)思路及算法分析

    1.算法用途: 用于遍历图中的节点,有些类似于树的深度优先遍历.这里唯一的问题是,与树不同,图形可能包含循环,因此我们可能会再次来到同一节点. 2.主要思想: 借用一个邻接表和布尔类型数组(判断一个点 ...

  4. 深度优先搜索理论基础与实践(java)

    概论 深度优先搜索属于图算法的一种,是一个针对图和树的遍历算法,英文缩写为 DFS 即 Depth First Search.深度优先搜索是图论中的经典算法,利用深度优先搜索算法可以产生目标图的相应拓 ...

  5. 【数据结构与算法Python版学习笔记】图——骑士周游问题 深度优先搜索

    骑士周游问题 概念 在一个国际象棋棋盘上, 一个棋子"马"(骑士) , 按照"马走日"的规则, 从一个格子出发, 要走遍所有棋盘格恰好一次.把一个这样的走棋序列 ...

  6. 深度优先搜索(DFS)

    [算法入门] 郭志伟@SYSU:raphealguo(at)qq.com 2012/05/12 1.前言 深度优先搜索(缩写DFS)有点类似广度优先搜索,也是对一个连通图进行遍历的算法.它的思想是从一 ...

  7. 初涉深度优先搜索--Java学习笔记(二)

    版权声明: 本文由Faye_Zuo发布于http://www.cnblogs.com/zuofeiyi/, 本文可以被全部的转载或者部分使用,但请注明出处. 上周学习了数组和链表,有点基础了解以后,这 ...

  8. 挑战程序2.1.4 穷竭搜索>>深度优先搜索

      深度优先搜索DFS,从最开始状态出发,遍历一种状态到底,再回溯搜索第二种. 题目:POJ2386  思路:(⊙v⊙)嗯  和例题同理啊,从@开始,搜索到所有可以走到的地方,把那里改为一个值(@或者 ...

  9. 回溯 DFS 深度优先搜索[待更新]

      首先申明,本文根据微博博友 @JC向北 微博日志 整理得到,本文在这转载已经受作者授权!   1.概念   回溯算法 就是 如果这个节点不满足条件 (比如说已经被访问过了),就回到上一个节点尝试别 ...

随机推荐

  1. Linu下的Mysql学习详解_【all】

    Linux下Mysql简介 1.什么是Mysql(MariDB) 1.数据库:存储数据的仓库    2.关系型数据库:mysql(主流用5.5,5.6), oracle        本质:二维表   ...

  2. Windows as a Service(1)—— Windows 10服务分支

    前言 作为公司的IT管理员,管理全公司Windows 10操作系统的更新一直是工作中的头疼之处.微软提供了很多方法来帮助我们管理公司的Windows 10更新,比如Windows Server Upd ...

  3. 安装kubernetes 环境

    master: 10.6.2.170     #master节点兼做仓库 node-1: 10.6.2.171 node-2: 10.6.2.172 1.添加host解析 # cat << ...

  4. C#网络编程(一)基础篇

    简介: C#网络编程API包含在System.Net和System.Net.Sockets命名空间下,大部分网络操作都可以在其中找到相应的类来实现:包括Socket的创建和连接,网络流收发方法的封装, ...

  5. Hdfs&MapReduce测试

    Hdfs&MapReduce测试 测试 上传文件到hdfs 随意打开一个文件夹传一个文件试试(把javafx-src.zip传到hdfs的/根目录下):hadoop fs -put javaf ...

  6. 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. ...

  7. 死磕salt系列-salt 故障汇总

    这里将salt使用过程中遇到的所有的故障进行一个汇总. grains 匹配后多了一个列表 salt-master中配置jinja模板来匹配自定义的grins. vim /etc/salt/minion ...

  8. P1081 开车旅行

    题目描述 小 A 和小 B 决定利用假期外出旅行,他们将想去的城市从 1 到 N 编号,且编号较小的 城市在编号较大的城市的西边,已知各个城市的海拔高度互不相同,记城市 i 的海拔高度为 Hi,城市 ...

  9. 随手练——O(n)解决无序数组排序后的相邻最大差值

    题目从这儿看到的 : https://mp.weixin.qq.com/s/2OXg67MfBuQjDPAJxxD8rQ,但是公众号上讲错了,问题还挺严重的. 题目知识点:桶排序. 题目:有一个无序数 ...

  10. 【Oracle123】向OracleDB导入*.csv文件数据

    SQL*Loader Control File Reference https://docs.oracle.com/cd/B10501_01/server.920/a96652/ch05.htm Or ...