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

我痛苦地弄了很久,还是被卡住了我还真是▇了狗了。[传送门](特此声明:学校内部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. win8 便签工具

    启动或显示 Sticky Notes : Win+R--->StikyNot.exe 备份Sticky Notes 保存位置 : %AppData%\Microsoft\Sticky Notes ...

  2. 沉淀再出发:如何在eclipse中查看java的核心代码

    沉淀再出发:如何在eclipse中查看java的核心代码 一.前言   很多时候我们在eclipse中按F3键打算查看某一个系统类的定义的时候,总是弹出找不到类这样的界面,这里我们把核心对应的代码加进 ...

  3. [EffectiveC++]item17:以独立语句将newed对象置入智能指针

    Store newed objects in smart pointers in standalone statements

  4. python 函数式编程之lambda( ), map( ), reduce( ), filter( )

    lambda( ), map( ), reduce( ), filter( ) 1. lambda( )主要用于“行内函数”: f = lambda x : x + 2 #定义函数f(x)=x+2 g ...

  5. jquery-validation验证插件

    参考网站:菜鸟教程 一.导入js <script src="http://static.runoob.com/assets/jquery-validation-1.14.0/lib/j ...

  6. 内网渗透中的mimikatz

    0x00 前言 上篇测试了中间人攻击利用框架bettercap,这次挑选一款更具代表性的工具--mimikatz 0x01 简介 mimikatz,很多人称之为密码抓取神器,但在内网渗透中,远不止这么 ...

  7. 020.2.2 runtime类

    基本不用,简单看一下就行了 1.属于单例的一个实例,可以通过getRuntime()获取对象Runtime r = Runtime.getRuntime();r.exec("winmine. ...

  8. BZOJ 1041 圆上的整点 数学

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1041 题目大意:求一个给定的圆(x^2+y^2=r^2),在圆周上有多少个点的坐标是整 ...

  9. mysql-5.5 for linux源代码安装

    mysql-5.5 for linux源代码安装 1.使用Yum安装依赖软件包 # yum install -y gcc gcc-c++ gcc-g77 autoconf automake bison ...

  10. linux 根据端口号查看占用进程的pid

    1.netstat -nap | grep 端口号 2.第一种的可以查看端口号对应的pid,但是会出现pid为空的情况,这种时候用:lsof -i:端口号 3.根据pid查看端口号 netstat - ...