Python
 Computer >> コンピューター >  >> プログラミング >> Python

C++で指定された依存関係からタスクの順序を見つけます


n個の異なるタスクがあるとします。これらのタスクには、0からn-1までのラベルが付けられています。一部のタスクには前提条件のタスクがある場合があるため、例として、タスク2を選択する場合は、最初にタスク1を終了する必要があります。これはペアとして表されます-[2、1]タスクの総数とリストがある場合前提条件のペアのうち、すべてのタスクを完了するには、タスクの順序を見つける必要があります。正しい注文が複数ある場合は、そのうちの1つを返品できます。また、指定されたすべてのタスクを完了することが不可能な場合は、空の配列を返します。

したがって、入力がn =4で、A =[[1、0]、[2、0]、[3、2]、[3、1]、[4,2]]の場合、出力は次のようになります。 [0、2、1、4、3]

これを解決するには、次の手順に従います-

  • 関数dfs()を定義します。これにより、グラフ、開始、オンパス、訪問された配列、配列toposort、

    が取得されます。
  • 訪問済み[開始]がマークされている場合、-

    • falseを返す

  • onpath [start]:=true、visited [start]:=true

  • グラフ[開始]の各ネイバーについて、実行

    • onpath [neighbor]がtrueの場合、またはdfs(graph、neighbor、onpath、visited、toposort)がtrueの場合、-

      • trueを返す

    • toposortの最後にstartを挿入

  • onpath [start]:=false

    を返します
  • メインの方法から、次のようにします-

  • グラフ=事前配列に格納されたn個の頂点とエッジを使用してグラフを作成します

  • 配列トポソートを定義する

  • サイズnの配列onpathを定義し、falseで埋めます

  • サイズnの訪問済み配列を定義し、falseで埋めます

  • 初期化i:=0の場合、i

    • visited [i]がfalseで、dfs(graph、i、onpath、visited、toposort)がtrueの場合、-

      • 空白の配列を返す

  • 配列toposortを逆にします

  • toposortに戻る

理解を深めるために、次の実装を見てみましょう-

#include <bits/stdc++.h>
using namespace std;
vector<unordered_set<int> > create_graph(int n, vector<pair<int, int> >& pre) {
   vector<unordered_set<int> > graph(n);
   for (auto pre : pre)
      graph[pre.second].insert(pre.first);
   return graph;
}
bool dfs(vector<unordered_set<int> >& graph, int start,vector<bool>& onpath, vector<bool>& visited, vector<int>& toposort) {
   if (visited[start])
      return false;
   onpath[start] = visited[start] = true;
   for (int neigh : graph[start])
      if (onpath[neigh] || dfs(graph, neigh, onpath, visited, toposort))
         return true;
   toposort.push_back(start);
   return onpath[start] = false;
}
vector<int> get_order(int n, vector<pair<int, int> > &pre){
   vector<unordered_set<int> > graph = create_graph(n, pre);
   vector<int> toposort;
   vector<bool> onpath(n, false), visited(n, false);
   for (int i = 0; i < n; i++)
      if (!visited[i] && dfs(graph, i, onpath, visited, toposort))
         return {};
   reverse(toposort.begin(), toposort.end());
   return toposort;
}
int main() {
   int n = 4;
   vector<pair<int, int> > pre = {{1, 0}, {2, 0}, {3, 2}, {3, 1},{4,0}};
   vector<int> v = get_order(n, pre);
   for (int i = 0; i < v.size(); i++) {
      cout << v[i] << " ";
   }
}

入力

4, {{1, 0}, {2, 0}, {3, 2}, {3, 1},{4,0}}

出力

0 1 4 2 3

  1. C ++を使用して、指定されたポイントから可能な四辺形の数を見つけます

    四辺形は、ユークリッド平面幾何学で4つの頂点と4つのエッジを持つポリゴンを形成します。名前4-gonなど。四辺形の他の名前に含まれ、正方形、表示スタイルなどとしても知られています。 この記事では、与えられた点から可能な四辺形の数を見つけるためのアプローチを説明します。この問題では、デカルト平面に提供された4つの点(x、y)を使用して作成できる四辺形の数を調べる必要があります。だからここに与えられた問題の例があります- Input : A( -2, 8 ), B( -2, 0 ), C( 6, -1 ), D( 0, 8 ) Output : 1 Explanation : One quadr

  2. C++で指定された開始文字からの最長の連続パスの長さを検索します

    異なる文字のマトリックスが与えられます。 1つの文字から始めて、現在の文字よりも大きいすべての文字をトラバースすることにより、最長のパスを見つける必要があります。文字は互いに連続しています。 Eから始まります。 最長のパスを見つけるために、深さ優先探索アルゴリズムを使用します。 DFS中に、いくつかのサブ問題が複数回発生する場合があります。そのサブ問題の計算を何度も回避するために、動的計画法のアプローチを使用します。 例 #include<iostream> #define ROW 3 #define COL 3 using namespace std; // tool