【问题标题】:DFS and lexicographic path in directed graph?有向图中的DFS和字典路径?
【发布时间】:2020-07-15 02:15:40
【问题描述】:
  • 给定的有向图有 N(1

例如:我们有 N=4 和 M=4 和 E={{1,4},{4,2},{1,2},{2,3}}, s=1 和 t= 3.所以答案是 1->2->3。

这是我的尝试:我使用 DFS 算法列出了从 s 到 t 的所有路径。并将它们添加到vector中。然后,我对其进行排序并打印第一条路径。但我得到了 TLE。

现在,我不知道如何优化这个问题,你能帮我解决这个问题

这是我的代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define maxn (ll)(1e5+5)
#define pb push_back
vector<ll> adj[maxn];
vector<vector<ll>> poi;
vector<ll> really;
ll n,m,i,j,s,d,u,v;
void candy(vector<ll> yui){
   poi.push_back(yui);
   for(i=0;i<poi[0].size();i++) cout<<poi[0][i]+1<<" ";
   exit(0);

}
void aka(ll u, ll d, bool visited[], ll path[], ll &path_index){
   visited[u]=true;
   path[path_index]=u;
   path_index++;
   if(u==d){
      really.clear();
      for(ll i=0;i<path_index;i++)
      really.push_back(path[i]);
      candy(really);
      return ;
   }
   else{
    sort(adj[u].begin(),adj[u].end());
    for(ll i=0;i<adj[u].size();i++)
        if(!visited[adj[u][i]]) aka(adj[u][i],d,visited,path,path_index);
   }
   path_index--;
   visited[u]=false;
}
void solve(ll s, ll d){
   bool visited[maxn];
   ll path[maxn];
   ll path_index = 0;
   for(ll i=0;i<n;i++) visited[i]=false;
   aka(s,d,visited,path,path_index);
}
int main(){
     ios_base::sync_with_stdio(false);

 cin.tie(NULL);

 cout.tie(NULL);
    cin>>n>>m>>s>>d;
    s--;
    d--;
    while(m--){
        cin>>u>>v;
        u--;v--;
        adj[u].pb(v);
    }
    solve(s,d);
   
}

【问题讨论】:

    标签: c++ algorithm time-complexity complexity-theory graph-algorithm


    【解决方案1】:

    您可以尝试以下方法,而不是获取从 s 到 t 的所有路径:
    在每次 DFS 调用中,假设当前节点为 n,获取 n 的所有未发现邻居,按升序对它们进行排序,并从最小的一个开始递归调用它们。
    请注意,在返回之前无需重置visited 状态,因为从s 到t 的第一个找到的路径是我们需要的(因此我们不需要检查任何其他路径)

    需要考虑的两个基本情况:

    1. n 的邻居之一是t
    2. n 没有未发现的邻居

    时间复杂度为O(V * VlogV + E)

    【讨论】:

    • O(V*VlogV+E) with |V|~10^5 可能会得到 TLE
    • @knowdont 与您发布的指数时间全路径搜索相比,它仍然更好
    • 是的,它显然比我发布的要好。但是在我对V中所有顶点u的所有邻居进行排序之后,当找到一条路径时立即中断,但它仍然得到TLE
    • @knowdont 好吧,很遗憾听到这个消息,也许其他用户会发布更好的方法
    • 换句话说,很明显,你的 Vi 之和最多为 E,每个 Vi
    猜你喜欢
    • 2012-11-27
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 2021-12-09
    • 1970-01-01
    • 2021-10-20
    • 2021-06-11
    相关资源
    最近更新 更多