【问题标题】:Shortest path in a graph in c without static vector没有静态向量的c图中的最短路径
【发布时间】:2015-07-04 22:56:17
【问题描述】:

我有一个包含双向和单向链接组合的图,我需要找到两个给定节点之间的最短路径,我不能使用任何静态向量或矩阵。

我还需要指定使用的路径中的所有节点。

这是我创建图表的方式,所以每个节点都有一个指向他连接的节点的指针,关于我如何做到这一点的任何想法?我尝试创建另一个结构,沿着所有指针移动,直到找到给定的命运,但这只是一团糟。

struct cel {
    int rota1,rota2,rota3,rota4,rota5;
    struct cel *p1,*p2,*p3,*p4,*p5;
};

typedef struct cel celula;

    celula* newnode(struct cel *p1,struct cel*p2,struct cel*p3,struct cel*p4,struct cel*p5, int rota1,int rota2,int rota3,int rota4,int rota5){
    celula* new,*aux;

    new= (celula *) malloc( sizeof( celula ));
    if(new== NULL)
    printf("Erro!");
    new->p1=p1;
    new->p2=p2;
    new->p3=p3;
    new->p4=p4;
    new->p5=p5;
    new->rota1,rota2,rota3,rota4,rota5=0;
    aux = new;
    return (aux);
}

celula * UTFPR;
celula * JAPAO;
celula * REIDOPAO;
celula * ESTACAO;

UTFPR = newnode(REIDOPAO,JAPAO,ESTACAO,NULL,NULL,1,2,1,0,0);
REIDOPAO = newnode(JAPAO,UTFPR,NULL,NULL,NULL,2,1,0,0,0);
JAPAO = newnode(ESTACAO,UTFPR,REIDOPAO,NULL,NULL,2,2,2,0,0);
ESTACAO = newnode(UTFPR,JAPAO,NULL,NULL,NULL,1,2,0,0,0);

【问题讨论】:

  • 标准警告:不要将void *(例如由malloc()返回)转换为/从其他指针!注意:你不应该使用new。如果您曾经使用 C++ 编译器编译该代码,则会产生错误。
  • @Olaf:一方面我同意这两种说法,另一方面我不得不注意到它们相互矛盾。
  • @MikeMB:现在当我阅读您的评论时,我注意到:-)。你是绝对正确的!但是,与使用 new 作为标识符查找错误相比,稍后添加演员表可能会带来更少的麻烦。后者也可能会混淆语法突出显示,正如我们在 SO 上看到的那样(注意new 的颜色)。而且我认为如果使用不同的标识符并没有什么坏处,而强制转换 malloc 也可以。
  • @Olaft:我完全同意。

标签: c graph


【解决方案1】:

您需要实现 Dijkstra 算法。你可以在这里找到解释和伪代码https://en.wikipedia.org/wiki/Dijkstra%27s_algorithm

【讨论】:

  • 嗯,问题是 Dijkstra 的算法使用向量,我很难在没有任何向量的情况下制作这些。还是谢谢
  • 我链接的代码是伪代码——你可以使用任何你想要的数据结构来实现它。您所需要的只是一种使用特定索引存储值的方法,然后从索引中检索该值。该算法不会根据数据的存储方式而改变。您可以通过指定 setValue(index, value) 和 getValue(index) 使其完全抽象,然后使用您喜欢的任何方式实现它们。
猜你喜欢
  • 2018-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-19
相关资源
最近更新 更多