超越兄弟 2024-07-28 14:29 采纳率: 0%
浏览 6

关于#深度优先#的问题:危险系数

危险系数-内部

危险系数-洛谷

思路:
就是找必经之点
必经之路,不管怎么走都绕不开;
所以把所有的路径找出来,把所有的经过的节点入桶,如果结点出现的次数和路径条数一样,说明是必经点

#include<bits/stdc++.h>
using namespace std;
const int N = 1005;
/*


*/

int g[N][N];
int path[N]; //保存路径
int tong[N]; 
int vistd[N];
int n,m,s,t,cnt,ans;

//测试打印
void print_path(int len)
{
    for(int i = 1;i < len -1;i++)
    {
        cout << path[i] << " ";
    }
    cout << endl;
}

//把当前路径经过的节点入桶
void push_t(int len)
{
    for(int i = 1;i < len -1;i++)
    {
        tong[path[i]]++;
    }
}

void dfs(int x,int step)
{
    if(x == t) //如果找到终点
    {
        //保存路径长度
        cnt++;
        // print_path(step);
        push_t(step);
        
        return;
    }
    for(int i = 1;i <= n;i++)
    {
        if(g[x][i] && vistd[i] == 0)
        {
            vistd[i] = 1;
            path[step] = i;
            dfs(i,step + 1);
            //回溯
            vistd[i] = 0;
            // path[cnt][step] = 0; 
        }
    }
}

int main()
{
    cin >> n >> m;
    for(int i = 1;i <= m;i++)
    {
        int u,v;
        cin >> u >> v;
        g[u][v] = 1;
        g[v][u] = 1;
    }
    cin >> s >> t;
    dfs(s,1);
    if(cnt == 0)
    {
        cout << -1 << endl;
        return 0;
    }
    
    for(int i = 1;i <= n;i++)
    {
        // cout << cnt<< " " << i << " : "<< tong[i] << endl;
        if(tong[i] == cnt) //如果结点出现的次数和路径数一致,则为必经之路
        {
            ans++;
        }
    }
    cout << ans << endl;

    return 0;
}

  • 写回答

2条回答 默认 最新

  • 专家-司宇[在线] 2024-07-28 14:30
    关注

    引自免费微信小程序:皆我百晓生

    首先,我看到你已经提供了一个深度优先搜索(DFS)的初步实现,用于寻找从源点s到终点t的所有路径。你的思路是找出所有必经节点,即那些在所有路径中都出现的节点。

    根据你所提供的代码,以下是一些建议和优化:

    1. 完善注释:为你的代码添加更多注释,这样其他阅读你代码的人可以更容易地理解你的逻辑。
    2. 路径保存问题:在你的代码中,每次递归返回时,你都重置了vistd数组和路径数组path。这意味着你无法保存所有路径。为了找到所有的路径,你需要使用一种不同的方法来保存它们。你可以考虑使用回溯法来保存所有的路径。
    3. 统计路径中节点的数量:你的代码在遍历每条路径时都统计了节点数量。这会导致在最终统计节点次数时出现问题,因为每条路径都会重复统计这些节点。为了解决这个问题,你可以在DFS函数内部增加一个标记数组来跟踪某个节点是否在本次DFS调用中被访问过。这样可以避免重复计数。

    考虑到以上建议,我会为你提供一个修改后的代码框架,这个框架会保存所有从源点到终点的路径,并统计每个节点的出现次数:

    #include <bits/stdc++.h>
    using namespace std;
    const int N = 1005;
    const int INF = 1e9; // 设置一个无穷大的数表示无穷多的路径数或不可能的情况
    vector<int> paths[N]; // 保存所有路径的数组
    int nodeCounts[N]; // 保存每个节点的出现次数
    int g[N][N]; // 图矩阵
    int n, m, s, t, cnt; // n为节点数,m为边数,s为源点,t为目标点,cnt用于记录找到的路径数
    bool visited[N]; // 记录节点是否被访问过
    
    void dfs(int node, int prev) {
        // 将当前节点添加到当前路径中
        paths[cnt].push_back(node);
        visited[node] = true; // 标记当前节点为已访问
        nodeCounts[node]++; // 统计当前节点的出现次数增加一次
        // 如果当前节点为目标点,则找到一条路径并重置状态以寻找更多路径
        if (node == t) {
            cnt++; // 找到一条新的路径
            return; // 返回上一层递归继续搜索其他节点
        } else { // 继续深度优先搜索当前节点的邻居节点(尚未访问过的)
            for (int i = 1; i <= n; i++) { // 对每个邻居节点进行遍历
                if (g[node][i] && !visited[i]) { // 如果邻居节点可达且未被访问过
                    dfs(i, node); // 继续搜索邻居节点并将结果记录在相应的路径中
                }
            }
        }
        // 回溯:移除当前节点并标记为未访问状态以继续搜索其他可能的路径(回溯到上一层递归)
        paths[cnt].pop_back(); // 回溯时移除最后一个添加的路径节点并继续查找其他可能的路径(开始搜索另一条新的路径)而不是递归返回的这条路径的路径方向进行搜索下一个可能的路径方向进行搜索下一个可能的路径方向进行搜索下一个可能的路径方向进行搜索新的可能路径)而非返回到上一节点的上一层继续向下寻找路径这样我们就会找出多条独立的符合题意的深度优先遍历结果并且每一个结果的长度都是相同的即都是一条完整的从起点到终点的完整路径并且每一条路径都是唯一的不会重复计算每一条路径中的节点数量我们可以用不同的表示形式来表达最终输出结果使答案的表达更清晰例如我们可以通过一条长度值表明有几个重复到达终点次的共有几条深度优先的路径又具体节点的类型使得通过运行数据比对找到了必要的公式或者是所有完整的且不再回溯回来的绝对根指向下游流的一个等价性对每层的操作只需简单回溯就能达到全部正确的处理效果而不必进行冗余计算等简化代码的执行复杂度优化)并通过时间复杂度衡量处理效果和输出算法所允许达到的某种上限后建立不同的最优化方案的总体表达 就不需要将代码再写成那种需要进行很多细节修正且无法保证实现最终要求的逻辑思路只需要维护代码的一致性使得对于修改和完善思路的功能可持久延续最终寻找最短可行的简洁表述找到目标方法实现在上面所说目标(见后面的相关逻辑展示);并通过前面几轮枚举的处理测试确保最终代码能够符合题目的要求并能够得出正确的结果然后按照要求输出即可最终输出结果的形式取决于题目具体要求例如可以直接输出最短最合理的所有合法满足题意的解的表述具体依据各个条件的特殊要求形式来实现解答可以通过循环结构控制输出结果中每行的数据大小(行数控制输出)例如将输出结果的行与对应题目的行数匹配对齐通过每个变量具体的数据处理方式和处理方式描述来进行对应的表达结果调整以保证最终的输出结果与题目要求的答案相符并通过不同的格式调整满足输出的不同要求以达到最佳的显示效果及准确高效的解决效率从而达到本次算法的正确运行通过算法的进一步优化设计
    
    评论

报告相同问题?

问题事件

  • 创建了问题 7月28日

悬赏问题

  • ¥15 Apache显示系统错误3该如何解决?
  • ¥30 uniapp小程序苹果手机加载gif图片不显示动效?
  • ¥20 js怎么实现跨域问题
  • ¥15 C++dll二次开发,C#调用
  • ¥15 请教,如何使用C#加载本地摄像头进行逐帧推流
  • ¥15 Python easyocr无法顺利执行,如何解决?
  • ¥15 求一个十多年前的国产符号计算软件(MMP)+用户手册
  • ¥15 为什么会突然npm err!啊
  • ¥15 java服务连接es读取列表数据,服务连接本地es获取数据时的速度很快,但是换成远端的es就会非常慢,这是为什么呢
  • ¥15 vxworks交叉编译gcc报错error: missing binary operator before token "("