2016-12-25 6 views
0

g内の頂点の数がv以下でN以下であることをグラフのトラバーサル(私はBSTを考えていた)を使用しなければならないこれは、距離が小さいほど移動距離が短いことである。頂点xの等間隔d以下の頂点の数を求める

int succN (Grafo g, int v, int N) 

私はで動作するように、この構造体を持っている:

#define MAX 100 

typedef int WEIGHT; 

struct edge { 
    int dest; 
    WEIGHT weight; 
    struct edge *next; 
}; 

typedef struct edge Edge; 
typedef struct edge *GraphL[MAX]; 

私はC言語で効率的なソリューションを作るために困難な時期を持っています。唯一の方法は、現在、BSTを使用してaux関数で再帰呼び出しを行うことです。

+0

ダイクストラのアルゴリズムを探索できます。ループ条件によっては、必ずしもすべてのノードにアクセスする必要はなく、ターゲットノードへの最短経路を見つけるか、またはすべてのノードを1回訪問して、最初から最短距離を見つけます。両方の用途が効率的なアルゴリズムを作ります。 –

+0

@WeatherVaneこの特定のケースでは、重みは1です。重み付きグラフではありません。私はまだダイクストラのアルゴリズムを使うことができますか? –

+0

はいできます。 –

答えて

0

重みが負でない場合、ダイクストラアルゴリズムを使用できます。 ここには簡単な疑似コードがあります。それはO(n^2)時間の複雑さ(n =ノードの数)を持っています。

ans = 0 
dist[0 .. n-1, None] = {INF, ..., INF} 
dist[v] = 0 
iterate n times 
    best = None 

    for each node u 
     if not seen[u] and dist[u] < dist[best] 
     best = u 

    if dist[best] > N 
     break 

    seen[best] = true 
    ans++ 
    for each edge from best (going to v, of weight w) 
     if dist[best] + w < dist[v] 
     dist[v] = dist[best] + w 

return ans 

(あなたはコメントで指摘されているとして)すべての重みが1に等しい場合、breadth-first searchは十分でしょう。

関連する問題