有向图:具有最大权重的(非简单)路径

时间:2018-05-28 13:22:13

标签: c graph graph-algorithm

有向图和加权图通过其边缘列表保存在文件中,格式如下:v1 val v2,表示v1v2连接,边缘为权重{ {1}}(int> 0)。 这是输入文件的示例

val

我必须编写一个C程序:

  1. 读取文件并将图表保存在适当的数据结构中
  2. 收到两个顶点fF 1 123 A0 2 fF A0 5 h9 h9 3 123 123 2 F2 123 4 d1 F2 3 Dd F2 4 d1 d1 2 Dd d1 4 xd d1 1 h9 Dd 5 xd xd 4 A0 F2 3 fF v1以及两个整数v2k(k <= p)后,打印从p开始的路径并以v1结尾,尊重以下约束
    • 是权重之和的最大值
    • 至少重叠k个顶点
    • 重叠的重复数量至少为p
    • 路径到达目的地顶点时结束
  3. 我解决了第一点,但我不知道第二点。这就是我写的所有代码:

    的main.c

    v2

    edge.h

    #include <stdio.h>
    #include <stdlib.h>
    #include "graph.h"
    
    void main() {
        int k = 1, p = 1;
        char v1[21], v2[21];
        graph_t G = GRAPHread("file.txt");
        printf("Insert 2 vertex");
        scanf("%s %s", v1, v2);
        GRAPHfindPath(G, k, p, v1, v2);
    }
    

    edge.c

    #ifndef EDGE_H
    #define EDGE_H
    
    typedef struct edge_s { int v; int w; int wt; } edge_t;
    
    edge_t EDGEcreate(int v, int w, int wt);
    
    #endif
    

    ST.h

    #include "edge.h"
    
    edge_t EDGEcreate(int v, int w, int wt) {
        edge_t e;
        e.v = v;
        e.w = w;
        e.wt = wt;
        return e;
    }
    

    ST.c

    #ifndef ST_H
    #define ST_H
    
    typedef struct symbletable_s *st_t;
    
    int STinsert(st_t st, char *key);
    int STsearch(st_t st, char *k);
    st_t STinit(int maxN);
    
    #endif
    

    graph.h

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include "ST.h"
    
    struct symbletable_s { char **a; int M; };
    
    st_t STinit(int maxN) {
        int i;
        st_t st = malloc(sizeof(*st));
        st->M = maxN;
        st->a = malloc(sizeof(char *)*st->M);
        return st;
    }
    
    int hash(char *k, int M) {
        int h = 0, base = 127;
        for (; *k != '\0'; k++) h = (base*h + *k) % M;
        return h;
    }
    
    int full(st_t st, int i) {
        if (st->a[i] == NULL) return 1;
        return 0;
    }
    
    int STinsert(st_t st, char *key) {
        int i = hash(key, st->M);
        while (full(st,i))
            i = (i + 1) % st->M;
        st->a[i] = malloc(sizeof(char)*(strlen(key) + 1));
        memcpy(st->a[i], key, strlen(key) + 1);
        return i;
    }
    
    int STsearch(st_t st, char *k) {
        int i = hash(k, st->M);
        while (full(st, i)) {
            if (strcmp(k, st->a[i]) == 0) return i;
            else i = (i + 1) % st->M;
        }
        return -1;
    }
    

    graph.c

    #ifndef GRAPH_H
    #define GRAPH_H
    
    typedef struct graph_s *graph_t;
    
    graph_t GRAPHread(char *s);
    void GRAPHfindPath(graph_t G, int k, int p, char *v1, char *v2);
    
    
    #endif
    

0 个答案:

没有答案