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

我痛苦地弄了很久,还是被卡住了我还真是▇了狗了。[传送门](特此声明:学校内部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. map() Filter() lambda函数说明

    map()函数接收两个参数,一个是函数,一个是序列,map将传入的函数依次作用到序列的每个元素,并把结果作为新的list返回 #通过map()函数将list中的数字转换为字符 map(str,rang ...

  2. [tools]notepad++当前文件路径不是工作路径

    Time:2015/04/09 描述: 在notepad++中运行lua,工作路径不是当前文件的路径,而是notepad++的安装目录 修改: 把差将中的NppExec --> Follow $ ...

  3. 在NGUI中高效优化UIScrollView之UIWrapContent的简介以及使用

    前言: 1.我使用的NGUI版本为 v3.7.5,不知道老版的NGUI是否有UIWrapContent 这个脚本. 2.本文讲解主要以图片显示的例子为主,本文例子UIScrollView是水平方向,一 ...

  4. MySQL 数据库 -- 数据操作

    数据的增删改 一 介绍 MySQL数据操作: DML ======================================================== 在MySQL管理软件中,可以通过 ...

  5. linux 三大利器 grep sed awk 正则表达式

    正则表达式目标 正则表达式单字符: 特定字符 范围字符:单个字符[ ] :代表查找单个字符,括号内为字符范围 数字字符:[0-9],[259] 查找 0~9 和 2.5 .9 中的任意一个字符 小写字 ...

  6. php给$_POST赋值会导致值为空

    在调试一个程序的时候发现很奇怪的现象,post传过来的值再某些地方为空,先看下面的代码 <?php if($_POST['submit'] == 'Add'){ if($_POST['type' ...

  7. Vim 编辑器及其基本操作

    实验楼某些课程有用 Vim 编辑器来写代码,因此有了这篇博客,据说是上古神器,当然主要目的是基本操作. Vim 编辑器 Vim(Vi IMprove) 是 Linux 系统上的最著名的文本/代码编辑器 ...

  8. Python2.7 - IMOOC - 2

    第三章 Python变量和数据类型 3-1.数据类型 在Python中,能够直接处理的数据类型有以下几种: 整数 Python可以处理任意大小的整数,当然包括负整数,表示方法和数学上的写法一模一样,十 ...

  9. error MSB8031: Building an MFC project for a non-Unicode character set is deprecated. You must change the project property to Unicode or download an additional library. See http://go.microsoft.co

    Win10,也重新装了免费版的Visual Studio 2013 y,写MFC程序时候发现这样的提示: error MSB8031: Building an MFC project for a no ...

  10. facebook页面种简单测试js调用flash开放的js接口的方法

    无意间折腾出来的,此方法很triky,但是很简单有效. 背景说明: facebook种内嵌的iframe无法直接访问. 解决方法: chrome浏览器为例 1.右键查看iframe源代码,此时进入if ...