DAG(有向非巡回グラフ)でSSSP(単一ソース最短経路)を見つけるためのC++プログラム
これは、ダイクストラアルゴリズムを使用してDAG(有向非巡回グラフ)でSSSP(単一ソース最短経路)を見つけるC ++プログラムであり、グラフの最初のノードから、頂点の各ペアの横に表示される最短経路長を持つ他のすべてのノードまでを見つけます。
アルゴリズム
Begin Take the elements of the graph as input. function shortestpath(): Initialize the variables a[i] = 1 d[i] = 0 s[i].from = 0 Initialize a loop for i = 0 to 3 do if b[0][i] == 0 continue else d[i] = b[0][i] s[i].from = 0 done done Initialize a loop while (c < 4) initialize min = INFINITY for i = 0 to 3 do if min <= d[i] or d[i] == 0 or a[i] == 1 continue else if min > d[i] min = d[i] done for loop int k = 0 to 3 do if (min == d[k]) t = k break else continue done Initialize a[t] = 1 for j = 0 to 3 if a[j] == 1 or b[t][j] == 0 continue else if a[j] != 1 if d[j] > (d[t] + b[t][j]) d[j] = d[t] + b[t][j] s[i].from = t done Increment c done For loop i = 0 to 3 Print minimum cost from node1 to node2. done End
例
#include <iostream> using namespace std; #define INFINITY 9999 struct node { int from; } s[4]; int c = 0; void djikstras(int *a, int b[][4], int *d) { int i = 0, j, min, t; a[i] = 1; d[i] = 0; s[i].from = 0; for (i = 0; i < 4;i++) { if (b[0][i] == 0) { continue; } else { d[i] = b[0][i]; s[i].from = 0; } } while (c < 4) { min = INFINITY; for (i = 0; i < 4; i++) { if (min <= d[i] || d[i] == 0 || a[i] == 1) { continue; } else if (min > d[i]) { min = d[i]; } } for (int k = 0; k < 4; k++) { if (min == d[k]) { t = k; break; } else { continue; } } a[t] = 1; for (j = 0; j < 4; j++) { if (a[j] == 1 || b[t][j] == 0) { continue; } else if (a[j] != 1) { if (d[j] > (d[t] + b[t][j])) { d[j] = d[t] + b[t][j]; s[i].from = t; } } } c++; } for (int i = 0; i < 4; i++) { cout<<"from node "<<s[i].from<<" cost is:"<<d[i]<<endl; } } int main() { int a[4]; int d[4]; for(int k = 0; k < 4; k++) { d[k] = INFINITY; } for (int i = 0; i < 4; i++) { a[i] = 0; } int b[4][4]; for (int i = 0;i < 4;i++) { cout<<"enter values for "<<(i+1)<<" row"<<endl; for(int j = 0;j < 4;j++) { cin>>b[i][j]; } } djikstras(a,b,d); }
出力
enter values for 1 row 0 1 3 2 enter values for 2 row 2 1 3 0 enter values for 3 row 2 3 0 1 enter values for 4 row 1 3 2 0 from node 0 cost is:0 from node 0 cost is:1 from node 0 cost is:3 from node 0 cost is:2
-
C++のソースからkを超える長さのパスがあるかどうかを確認します
コンセプト 与えられたグラフ、グラフ内のソース頂点、および数値k(ここでkは、ソース頂点と宛先頂点の間のグラフのパス長を示します)に関して、私たちのタスクは、開始する単純なパス(サイクルなし)があるかどうかを判断することです。指定されたソースから、他の頂点(つまり宛先)で終了します。グラフを以下に示します- 入力 Source s = 0, k = 64 出力 True 4があり、合計距離は68 kmで、64を超えています。 入力 Source s = 0, k = 70 出力 False 8)であるため、69を超える入力の場合は出力がfalseになります。 メソッド 重要なこ
-
有向グラフにオイラーパスが含まれているかどうかを確認するC++プログラム
オイラーパスはパスです。これにより、すべてのエッジを1回だけ訪問できます。同じ頂点を複数回使用できます。この場合、オイラー経路もあるため、オイラー回路を含む1つのグラフも考慮されます。 有向グラフにオイラーパスがあるかどうかを確認するには、これらの条件を確認する必要があります- 単一の頂点anが1つ存在する必要があります ここで(in-degree + 1 =out_degree) 単一の頂点bnが1つ存在する必要があります ここで(in-degree =out_degree + 1) これらのケースのいずれかが失敗した場合、すべての頂点に(in-degree =out_degree)RE