Why my C++14 KosaRaju algo getting TLE when a similar written code runs much faster

TLE code completes at 2.1 secs. I'm also passing many things through reference but it's still throwing a TLE. Why this code takes so much time?

here is the problem at hackerearth:

https://www.hackerearth.com/problem/algorithm/falling-dominos-49b1ed46/

Dominos are lots of fun. Children like to stand the tiles on their side in long lines. When one domino falls, it knocks down the next one, which knocks down the one after that, all the way down the line. However, sometimes a domino fails to knock the next one down. In that case, we have to knock it down by hand to get the dominos falling again. Your task is to determine, given the layout of some domino tiles, the minimum number of dominos that must be knocked down by hand in order for all of the dominos to fall.

Input

Первая строка ввода содержит одно целое число, определяющее количество следующих тестовых примеров. Каждый тестовый пример начинается со строки, содержащей два целых числа, каждое не более 100 000. Первое целое число n - это количество плиток домино, а второе целое число m - это количество строк, которые должны следовать в тестовом примере. Плитки домино пронумерованы от 1 до n. Каждая из следующих строк содержит два целых числа x и y, обозначающих, что если число домино x упадет, это вызовет падение числа домино y.

Выход

Для каждого тестового примера выведите строку, содержащую одно целое число - минимальное количество домино, которое необходимо перевернуть рукой, чтобы все домино упали.

ВХОД ОБРАЗЦА 1 3 2 1 2 2 3 ВЫХОД ОБРАЗЦА 1

код завершается на 2.1

#include <iostream>
    #include <vector>
    #include <unordered_set>
    #include <stack>

    using namespace std;


    void dfs(const vector<vector<int>> &edges, unordered_set<int> &visited,int sv, stack<int> &stk){
        visited.insert(sv);
        for(int i=0;i<edges[sv].size();i++){
            int current = edges[sv][i];
            if(visited.find(current)==visited.end())
                dfs(edges, visited, current, stk);
        }
        stk.push(sv);
    }

    void dfs(const vector<vector<int>> &edges, unordered_set<int> &visited,int sv){
        visited.insert(sv);
        for(int i=0;i<edges[sv].size();i++){
            int current = edges[sv][i];
            if(visited.find(current)==visited.end())
                dfs(edges, visited, current);
        }
    }


    int main()
    {
        int t;
        cin>>t;
        while(t--){
            int V, E;
            cin>>V>>E;
            vector<vector<int>> edges(V+1);
            unordered_set<int> visited;
            stack<int> stk;
            while(E--){
                int f, s;
                cin>>f>>s;
                edges[f].push_back(s);
            }

            for(int i=1;i<=V;i++)
                if(visited.find(i)==visited.end())
                    dfs(edges, visited, i, stk);

            visited.clear();
            int count{0};
            while(!stk.empty()){
                int current = stk.top();
                stk.pop();
                if(visited.find(current)==visited.end()){
                dfs(edges, visited, current);
                count++;
                }
            }
           cout<<count<<endl;
        }
        return 0;
    }

Эффективный код завершается через 0,7 секунды.

  #include<iostream>

    #include<bits/stdc++.h>
    using namespace std;

       void dfs( vector<int> *edges , int start,int n,bool *visit ,stack<int> *nodex)
        {

          visit[start]  = true;
    //       cout<<start<<endl;

          for (int i = 0; i < edges[start].size(); ++i)
          {
                int next = edges[start][i];

                  if(visit[next] == false)
                   dfs(edges,next,n,visit,nodex);

          }

             nodex->push(start);
        }

     void dfs(vector<int> *edges,int start, bool *visit,int n)
    {
        visit[start] = true;

        for(int i=0;i<edges[start].size();i++)
        {
        int next = edges[start][i]; 
            if(visit[next]==false)
            dfs(edges,next,visit,n);
        }
    }

    int main()
    {
        int t;
        cin>>t;
      while(t--)
    {
           int n,m;
           cin>>n>>m;

           vector<int> *edges = new vector<int>[n+1];

                for (int i = 0; i < m; ++i)
                {
                    int start,end;
                     cin>>start>>end;

                     edges[start].push_back(end);  
                }

                //  cout<<"PHASE 1"<<endl;

                  bool *visit = new bool[n+1];

                  for (int i = 0; i<=n; ++i)
                  {
                    visit[i] = false;
                  }


                stack<int> *nodex = new stack<int>();

                 for (int i = 1; i<=n; ++i)
                   {
                     if(visit[i]  == false)
                       dfs(edges,i,n,visit,nodex);
                   }
                //   cout<<"PHASE 2"<<endl;

             for(int i=0;i<=n;i++)
              visit[i] = false;

                   int count=0;
                   while(!nodex->empty())
                        {
                       int up = nodex->top();
                        nodex->pop();
    //                  cout<<" EVERYTHING ISS FINE  "<<up<<endl;
                            if(visit[up] ==false )
                            {
                                dfs(edges,up,visit,n);
                                count++;
                            }       
                    //        cout<<"Everrything is fine "<<up<<endl;

                        }
                        cout<<count<<endl;

    }

        return 0;
    }

0 ответов

Используйте Fast I/O и "\n" вместо endl. Это очень помогает избавиться от TLE. Для меня остальная часть кода кажется прекрасной

Другие вопросы по тегам