AtCoder Beginner Contest 226 C dfs序 逆拓扑序

73 篇文章 2 订阅
43 篇文章 1 订阅

题目

一个武术高手,可以学T种武术,但他只想学第T个武术,学每个武术有需要花费的时间和前置武术条件(即要先学会前置的武术)。
求他学会第T个武术需要的最少时间。

题解思路

一开始想并查集什么的,没想太明白。
如果从图论想的话,这题就可以解决了。
如果正向建图的话,不容易得出答案的。因为起点难确定。
而如果反向建图的话,从T点出发往回跑,跑到每个武术的最基础武术点(即无需前置武术的那种)。并且每个点只跑一次。记录出来的就是答案。

帖大佬的一句话
在这里插入图片描述
我们反向跑的时候当这个点以及被学过了,那就没必要再跑一遍了。

参考题解

AC代码
#include <bits/stdc++.h>
//#include <unordered_map>
//priority_queue
#define PII pair<int,int>
#define ll long long

using namespace std;

const  int  INF =  0x3f3f3f3f;
const  int N = 200100 ; 

vector <int> head[N] ; 
int a[N] ; 
int vis[N] ; 

void dfs(int p )
{
    if ( p == 0 )
        return ;
    for (int i = 0 ; i < head[p].size() ; i++ )
    {
        int st = head[p][i] ; 
        if (!vis[st])
        {
            vis[st] = 1 ;
            dfs(st) ; 
        }
    }
}
int main()
{
    ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    int T ;
    cin >> T ;
    for (int j = 1 ; j <= T ; j++ )
    {
        int s , n ;
        cin >> s >> n ;
        a[j] = s ; 
        for (int i = 1 ; i <= n ; i++ )
        {
            int t1 ;
            cin >> t1 ; 
            head[j].push_back(t1) ; 
        }
    }
    dfs(T) ;
    long long ans = a[T] ;  
    for (int i = 1 ; i < T ; i++ )
        if (vis[i])
            ans += a[i] ;
    cout << ans << "\n" ; 
    return 0 ;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: atcoder beginner contest 226 是一个由 AtCoder 组织的初学者比赛,旨在为初学者提供一个锻炼自己编程能力的机会。比赛通常包括多个问题,难度从简单到困难不等,参赛者需要在规定时间内解决尽可能多的问题。该比赛吸引了来自世界各地的初学者参加,是一个非常有趣和有挑战性的比赛。 ### 回答2: AtCoder Beginner Contest 226 是日本AtCoder举办的一场新手比赛。这场比赛通常设有三到五个问题,题目难度逐渐增加,旨在让初学者锻炼编程技巧和算法思维。 比赛开始时,参赛选手需要在指定时间内独立解决各个问题。比赛网站提供了在线编程环境,选手可以使用C++、Python、Java等常见编程语言提交代码。解题的时间和代码正确性都会影响选手的得分。 题目的类型非常多样,通常涵盖了数据结构、图论、动态规划、贪心等算法知识点。选手可以从题目描述中获得输入输出的要求,并根据题意编写代码来解决问题。 在比赛过程中,选手需要尽快理解题目,并设计出正确的解决方案。正确的思路及合理的实现将是获得高分的关键。因此,参赛选手需要在比赛前充分复习算法知识、熟练掌握编程语言,并在实践中提高自己的编码能力。 ATCoder Beginner Contest 226 不仅考验了参赛选手的算法和编程水平,还对他们的应变能力和时间管理能力提出了要求。即使是经验丰富的选手,也需要在限定时间内思考问题、调试代码,尽量取得更好的成绩。 通过参加此类竞赛,选手可以提高自己的编程技能、拓宽解题思路,并加深对算法和数据结构的理解。同时,比赛过程中还可以与其他选手交流经验,提高团队合作和竞争意识。 总而言之,AtCoder Beginner Contest 226 是一场适合初学者的编程比赛,通过参与其中,选手可以提高自己的编程能力,拓宽算法思维,并享受竞赛的乐趣。 ### 回答3: AtCoder Beginner Contest 226是AtCoder举办的一场面向初学者的比赛。这场比赛通常由3到4道问题组成,涵盖了算法和编程的各个方面。 比赛开始时,参赛选手将在规定的时间内独立解答问题。每个问题都有不同的难度和分值,选手需要在限定时间内尽可能解决更多的问题,并在解答正确的情况下获得更高的得分。 比赛过程中,选手可以使用自己熟悉的编程语言,如C ++,Java或Python。他们需要运用算法和数据结构的知识,设计出高效的解决方案,并考虑到时间和空间的复杂度来优化代码。 此外,比赛还严格限制了提交次数和解答时间,这要求选手在思考和编码时要快速和准确。选手需要经常检查他们的代码是否符合问题的要求,并在必要时进行调试。 比赛结束后,AtCoder将根据选手的成绩排名,并授予他们相应的奖励。排在前几名的选手将获得奖牌,他们的成绩也将被列入AtCoder的排名榜。 总的来说,AtCoder Beginner Contest 226为初学者提供了一个锻炼算法和编程能力的机会。通过参加这样的比赛,选手可以提高他们的技能,并与其他热爱编程的人分享和交流。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值