大学連携アルゴリズムウィンターアカデミー第9回(DQ,Daestra)

13719 ワード

マルチアウトレットアルゴリズム

  • 図において、始点から目標頂点までの最短経路を解くアルゴリズム
  • O((V+E)logE)
  • が負に重み付けされた幹線が存在する場合は使用できません.
  • 優先キュー

  • データセンターを使用するには、優先キューについて理解する必要があります.
  • に入る順序にかかわらず、私たちが決定した優先度の高い要素が抽出されます.
  • hip構造を使用します.
  • hipというデータ構造を用いて,O(logn)に優先キューを挿入および削除することができる.
    お尻は完全にバイナリツリーです.
    c++ : priority_queue
    O(logn)演算で挿入を削除できます
    通常のキューと同様にtop,size,pop,beankなどの関数が内蔵されている.
    pqの実現方法
    //그냥 일반전인 pq
    #include <queue>
    //새로운 비교연산자 만들고 싶을 때
    #include <functional>
    //기본적 pq는 큰 수 부터 나옴
    priority_queue<ll> pq1;
    //작은 수 부터 나오게 하는 방법
    priority_queue<ll, vector<ll>, greater<>> pq2;
    첫번째는 어떤자료형, 두번쨰는 구현체 즉 pq가 담길 공간, 세번째는 비교함수이다.
    
    struct cmp{
    	bool operator()(ll x,ll y) {return abs(x-3) > abs(y-3);}
    };
    priority_queue<ll, vector<ll>, cmp> pq3;
    
    struct D{
    	int a,b,c;
    };
    
    struct cmpD{
    	bool operator() (D x,D y){
    		if(x.a<y.a) return true;
            return true;
    	}
    };
    priority_queue<D,vector<D>greater<cmpD>> pq4;

    質問する


    11286節

    #define _CRT_SECURE_NO_WARNINGS
    #define _USE_MATH_DEFINES
    #include <iostream>
    #include <algorithm>
    #include <string>
    #include <cstring>
    #include <cstdio>
    #include <functional>
    #include <cstdlib>
    #include <vector>
    #include <ctime>
    #include <cmath>
    #include <stack>
    #include <queue>
    #define ll long long
    #define len 1001
    using namespace std;
    
    int ans, i, j, n, m,s;
    vector<int> a[200001];
    
    struct cmp {
    	bool operator()(ll a,ll b) {
    		if (abs(a) == abs(b)) return a > b;
    		return abs(a) > abs(b);
    	}
    };
    
    int main() {
    	freopen("input.txt", "r", stdin);
    	ios_base::sync_with_stdio(false);
    	cin.tie(nullptr);
    	cout.tie(nullptr);
    
    	int t;
    	cin >> t;
    
    	priority_queue < ll, vector < ll>, cmp> pq;
    
    	while (t--) {
    		ll c;
    		cin >> c;
    		if (!c) {
    			if (pq.empty()) cout << "0" << '\n';
    			else {
    				cout << pq.top() << '\n';
    				pq.pop();
    			}
    		}
    		else {
    			pq.push(c);
    		}
    	}
    }

    マルチアウトレットアルゴリズム

  • がまだアクセスしていない頂点のうち、始点から最も短い頂点uにアクセスする.
  • は、頂点uに隣接しており、まだアクセスされていない頂点の距離を更新する.

  • 上記のように、距離を格納するための配列を格納します.出発地以外は無限初期化.
    また、接続されているノードごとに最小移動距離のみが選択されます.

    時間複雑度O(V+E)logE

    質問する


    1753最短パス