2-C / C ++の満足度(2-SAT)の問題?
f =(x1∨y1)∧(x2∨y2)∧...∧(xn∨yn)とします。
問題:fは満足できるか?
xi∨yiと および
すべて同等です。したがって、(xi∨yi)のそれぞれをこれらの2つのステートメントに変換しています。
ここで、2n個の頂点を持つグラフを想定します。 (xi∨yi)のそれぞれの場合、2つの有向エッジが追加されます
-
¬xiからyiへ
-
¬yiからxiへ
¬xiとxiの両方が同じSCC(Strongly Connected Component)にある場合、fは充足可能として扱われません
fが満足できるものとして扱われると仮定します。ここで、fを満たすために、各変数に値を提供します。これは、作成したグラフのトポロジカルソートの頂点を使用して実行できます。トポロジカルソートで¬xiがxiの後にある場合、xiはFALSEとして扱われる必要があります。それ以外の場合はTRUEとして扱う必要があります。
擬似コード
func dfsFirst1(vertex v1): marked1[v1] = true for each vertex u1 adjacent to v1 do: if not marked1[u1]: dfsFirst1(u1) stack.push(v1) func dfsSecond1(vertex v1): marked1[v1] = true for each vertex u1 adjacent to v1 do: if not marked1[u1]: dfsSecond1(u1) component1[v1] = counter for i = 1 to n1 do: addEdge1(not x[i], y[i]) addEdge1(not y[i], x[i]) for i = 1 to n1 do: if not marked1[x[i]]: dfsFirst1(x[i]) if not marked1[y[i]]: dfsFirst1(y[i]) if not marked1[not x[i]]: dfsFirst1(not x[i]) if not marked1[not y[i]]: dfsFirst1(not y[i]) set all marked values false counter = 0 flip directions of edges // change v1 -> u1 to u1 -> v1 while stack is not empty do: v1 = stack.pop if not marked1[v1] counter = counter + 1 dfsSecond1(v1) for i = 1 to n1 do: if component1[x[i]] == component1[not x[i]]: it is unsatisfiable exit if component1[y[i]] == component1[not y[i]]: it is unsatisfiable exit it is satisfiable exit
-
C++での棚のフィッティングの問題
この問題では、壁の長さW、棚のサイズn、およびmを示す3つの整数値W、n、mが与えられます。私たちのタスクは、フィッティングシェルフの問題を解決するプログラムを作成するです。 。 棚板を取り付けた後に残るスペースが最小限になるように、棚板を取り付ける方法を見つける必要があります。解決中の二次的な制約は製造コストです。棚が大きいほど費用効果が高いため、優先順位を付ける必要があります。 出力は次の形式である必要があります nサイズの棚の数残りのmサイズの棚の数 問題を理解するために例を見てみましょう Input: W = 12, n = 5, m = 3 Output: 0 4 0
-
C /C++でのバークレーのアルゴリズム
バークレーのアルゴリズムは、分散システムのクロック同期に使用されるアルゴリズムです。このアルゴリズムは、分散ネットワークの一部またはすべてのシステムにこれらの問題のいずれかがある場合に使用されます- A.マシンには正確なタイムソースがありません。 B.ネットワークまたはマシンにUTCサーバーがありません。 分散システム 物理的に分離されているが、ネットワークを使用して相互にリンクされている複数のノードが含まれています。 バークレーのアルゴリズム このアルゴリズムでは、システムはノードをマスター/リーダーノードとして選択します。これは、サーバーのプールノードから実行され