【问题标题】:Counting SCCs using DFS [closed]使用 DFS 计算 SCC [关闭]
【发布时间】:2013-03-03 19:13:30
【问题描述】:

我必须在 C 中创建一个编程代码,以使用深度优先搜索计算五个最大的强连通分量的大小。 我使用 Ubuntu 12.04 进行编程。我想出了以下代码,它在终端中显示的结果是:Segmentation Fault (core dumped) 那是在尝试查看将graph[MaxVer][MaxVer][2] 放入函数调用时会发生什么。

代码


#include "stdio.h"  
#include "stdlib.h" 
#define MaxVer 875714 

long int t=0;
long int visited[MaxVer][2]={0};
long int s=NULL;
long int leader[MaxVer];
long int time[MaxVer];
int count;

main()  
{  
    long int i,j,k;  
    long int Graph[MaxVer][MaxVer][2]={0};  
    FILE *fp;

    fp=fopen("SCC.txt","r");

    fscanf(fp,"%ld",&j);
    for(i=1;i<=875714;i++)
        while(i==j)
        {
            fscanf(fp,"%ld",&k);
            Graph[i-1][k-1][0]=1;
            fscanf(fp,"%ld",&j);
        }
    fclose(fp);

    DFS_loop(Graph,0);
    for(i=0;i<MaxVer;i++)
        for(j=0;j<MaxVer;j++)
            if(Graph[(time[i])][(time[j])][0]=1)
                Graph[i][j][1]=1;
    DFS_loop(Graph,1);
}

DFS_loop(long int graph[][][],long int i)
{
    long int node;
    for(node=MaxVer;node>0;node--)
        if(!visited[node-1][i])
        {
                s=node;
                DFS(graph,i,node);
                if(i==1&&count<5)
                    printf("%ld",t);
        }
}

DFS (long int graph[][][],long int i,long int node)
{
    long int node_2;
    visited[node-1][i]=1;
    leader[node-1]=s;

    for(node_2=1;node_2<=MaxVer;node_2++)
        if(graph[node_2-1][node-1][i]==1)
            if(!visited[node_2-1][i])
            {
                DFS(graph,i,node_2);
                if(i==1&&count<5)
                {
                    t++;
                    count++;
                }
            }
    if(i==0)
    {
        t++;
        time[t-1]=node;
    }
}

结束

谁能告诉我代码中的问题是什么? 编译时的主要问题发生在调用 DFS 和 DFS_loop 期间。它说“数组类型具有不完整的元素类型”。 是的,我想告诉你输入是在一个文件中给出的,有 875714 个顶点。 输入示例为 2 74657,其中 2 是尾部,74657 是有向边的头部。

另外,如果有人可以提出更好的程序,请提供。

【问题讨论】:

  • 欢迎来到 Stack Overflow!要求人们发现代码中的错误并不是特别有效。您应该使用调试器(或添加打印语句)来隔离问题,然后构造一个minimal test-case
  • 无法编译时如何调试?
  • 在你的第一段中,你说你得到了一个段错误,这是一个运行时的事情。为了运行,它必须已经编译...
  • 那是在尝试查看将 graph[MaxVer][MaxVer][2] 放入函数调用时会发生什么。

标签: c algorithm graph version-control depth-first-search


【解决方案1】:

main()之前制作适当的函数原型,并指定第2和第3维度的大小(使用graph[MaxVer][MaxVer][]而不是graph[][][]

【讨论】:

    猜你喜欢
    • 2011-01-11
    • 2021-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-20
    相关资源
    最近更新 更多