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

誰もがC++で友達になった最初の瞬間


ソーシャルグループに、0からN-1までの一意の整数IDを持つN人の異なる人々がいるとします。ここにログのリストがあります。各logs[i]=[time、id_A、id_B]には、負でない整数のタイムスタンプと2人の異なる人物のIDが含まれています。各ログには、2人の異なる人が友達になった時間が示されています。 AがBと友達である場合、BはAと友達です。AがBと友達である場合、またはAがBと知り合いである場合、AはBと知り合いであるとしましょう。すべての人が他のすべての人と知り合いになりました。そのような時間が見つからない場合は、-1を返します。したがって、入力が次のようになっている場合:[[20190101,0,1]、[20190104,3,4]、[20190107,2,3]、[20190211,1,5] 、[20190224,2,4]、[20190301,0,3]、[20190312,1,2]、[20190322,4,5]]、N =6、出力は20190301になります。これは、最初のイベントが発生するためです。タイムスタンプ=20190101で、人0と1が友達になった後、友情グループ[0,1]、[2]、[3]、[4]、[5]があります。次に、2番目のイベントがタイムスタンプ=20190104で発生し、人3と4が友達になった後、次の友情グループ[0,1]、[2]、[3,4]、[5]があります。その後、3番目のイベントはタイムスタンプ=20190107で発生し、人物2と3が友達になった後、次の友情グループ[0,1]、[2,3,4]、[5]があります。次に、4番目のイベントがタイムスタンプ=20190211で発生し、人1と5が友達になった後、次の友情グループ[0,1,5]、[2,3,4]があります。その後、タイムスタンプ=20190224で5番目のイベントが発生し、人2と4はすでに友達であるため、何かが起こります。最後に、6番目のイベントはタイムスタンプ=20190301で発生し、人0と3が友達になった後、全員が友達になります。

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

  • find()というメソッドを定義します。これは値xを取り、次のように機能します-

  • 親[x]が-1の場合、x

    を返します
  • 親[x]:=find(親[x])

  • 親を返す[x]

  • mainメソッドでは、次のように機能します-

  • サイズNの親とランクと呼ばれる2つの配列を定義し、親を-1で埋め、ランクを1で埋めます

  • ログを並べ替える

  • ログ内の各要素iについて-

    • i[1]とi[2]

      で結合を実行します
    • find(i [2])およびfind(i [1])

    • Nがランク配列にある場合は、i [0]

      を返します。
  • -1を返す

例(C ++)

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

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   int earliestAcq(vector<vector<int>>& logs, int N) {
      vector<int> ds (N, -1);
      sort(begin(logs), end(logs));
      for(vector<int> &k : logs) {
         if(un(k[1], k[2], ds) == N) return k[0];
      }
      return -1;
   }
   int un(int u, int v, vector<int> & ds) {
      u = find(u, ds);
      v = find(v, ds);
      if(u != v) {
         ds[v] += ds[u];
         ds[u] = v;
      }
      return -ds[v];
   }
   int find(int u, vector<int> & ds) {
      return ds[u] < 0? u : ds[u] = find(ds[u], ds);
   }
};
main(){
   vector<vector<int>> v = {
      {20190101,0,1},{20190104,3,4},{20190107,2,3},{20190211,1,5},
      {20190224,2,4},{20190301,0,3},{20190312,1,2},{20190322,4,5}
   };
   Solution ob;
   cout <<ob.earliestAcq(v, 6);
}

入力

[[20190101,0,1],[20190104,3,4],[20190107,2,3],[20190211,1,5],
[20190224,2,4],[20190301,0,3],[20190312,1,2],[20190322,4,5]]
6

出力

20190301

  1. C++のMazeIII

    空のスペースと壁のある迷路があり、その迷路の中にボールもあるとします。ボールは、上(u)、下(d)、左(l)、または右(r)の方向に転がることで空きスペースを通過できますが、壁にぶつかるまで転がり続けます。ボールが止まると、次の方向を選ぶことができます。その迷路にも1つの穴があります。ボールが穴に転がると、ボールは穴に落ちます。 したがって、ボールの位置、穴の位置、迷路がある場合、最短距離を移動することでボールがどのように穴に落ちるかを調べる必要があります。ここで、距離は、ボールがスタート(除外)からホール(含まれる)まで移動した空きスペースの数によって定義されます。 「u」、「d」、「l

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

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