UVALive - 3211 - 今すぐ以降(2-SAT、二分)

リンク:

https://vjudge.net/problem/UVALive-3211

質問の意味:

あなたが経験している必要がありますとおり、代わりにすぐに着陸、航空機は時々保持で待機
滑走路にループがあります。この保持機構は、スペース以外に管制官が必要とする
(遅延を低く抑えながら)滑走路に可能な限り航空機。これは正式のように定義される
「保持パターン」と指定された範囲内の航空機を維持するように設計された所定の操作である
(例えば、図1を参照)空域。
図1:パイロットテキストブックに記載されているように、単純なホールディングパターン。
ジム・Tarjan、航空交通コントローラは、改善するために彼を助けるために彼の兄弟ロバートを求めている
空港の行動を。
TRACONエリア
ターミナルレーダーアプローチコントロールは、(TRACON)コントロール航空機が近づくと離れる
彼らは空港の5と50マイルの間にあるとき。この最終スケジューリングプロセスでは、航空交通
コントローラは、着陸前にいくつかの航空機を待機させます。残念ながら、この「待機中」のプロセスは複雑であり、
航空機が所定のルートをたどり、その速度を変更することはできませんよう。ある程度の到達するには
、プロセスの柔軟性を、基本的な遅延手順は、航空機がホールディングパターンに従うようにすることです
TRACONエリアのために設計されました。そのようなパターンのために一定の所定の遅延発生
航空機(例えば、図1を参照します)。いくつかの保持パターンは同じTRACONで存在してもよいです。
以下では、我々は、単一の滑走路があることと、航空機が入ったときと仮定
TRACONエリアを、それが早期に着陸時、後半着陸時間と可能ホールディングパターンが割り当てられています。
航空機のように待つとランドいない状況に早期の着弾時間対応
できるだけ早く。航空機内の待ち状況に遅い着陸時間相当
、次いで所定の保持パターンとは、その時点で着陸。私たちは、航空機が最大で入ることを前提と
1つのホールディングパターン。したがって、初期および後期の着陸回数はのための2つだけの可能な時間です
着陸。
セキュリティギャップが連続着陸間の最小の経過時間です。目的はにあります
セキュリティギャップを最大化します。ロバートはあなたが助けることができると信じています。
例は
TRACONエリアの10航空機があるとします。表1は、早期の対応と提供して
後半に着陸回(コラム「早期」と「後期」)を。
航空機初期後期ソリューション
A1 44 156初期
A2 153 182初期
A3 48 109後期
A4 160 201後期
A5 55 186後期
A6 54 207初期
A7 55 165後期
A8 17 58アーリー
A9 132 160初期
A10 87 197初期
表1:A 10航空機問題のインスタンス。
最大のセキュリティギャップは10であり、対応する溶液は、表1(カラムに報告されています
"解決")。このソリューションでは、次の順序で航空機の土地:A8、A1、A6、A10、A3、A9、A2、A7、
A5、A4。セキュリティギャップは、航空機A1およびA6によって実現されます。

アイデア:

前半、毎回再構築されたマップを考えてみましょう。トレーニングガイド上に構築された図は、二つの関係に渡された、または実際に2-SATがある満たすために会いたいです。
2機の航空機の着陸時の条件を考慮し、この問題は数字を追加し、満たされていません。

コード:

//#include<bits/stdc++.h>
#include<iostream>
#include<string>
#include<cstdio>
#include<vector>
#include<string.h>
#include<cstring>
#include<set>
#include<queue>
#include<algorithm>
#include<math.h>
#include<stdio.h>
#include<map>
#include<stack>
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
const int MOD = 20071027;
const int MAXN = 2e3+10;
int Next[4][2] = {-1, 0, 0, 1, 1, 0, 0, -1};

vector<int> G[MAXN*2];
stack<int> St;
int dfn[MAXN*2], low[MAXN*2], sccnum[MAXN*2];
int a[MAXN][2];
int dfn_clock, scc_cnt;
int n, m;

void tarjan(int u)
{
    dfn[u] = low[u] = ++dfn_clock;
    St.push(u);
    for (int i = 0;i < (int)G[u].size();i++)
    {
        int v = G[u][i];
        if (!dfn[v])
        {
            tarjan(v);
            low[u] = min(low[v], low[u]);
        }
        else if (!sccnum[v])
            low[u] = min(dfn[v], low[u]);
    }
    if (low[u] == dfn[u])
    {
        ++scc_cnt;
        while(true)
        {
            int x = St.top();
            St.pop();
            sccnum[x] = scc_cnt;
            if (x == u)
                break;
        }
    }
}

bool solve()
{
    memset(dfn, 0, sizeof(dfn));
    memset(low, 0, sizeof(low));
    memset(sccnum, 0, sizeof(sccnum));
    dfn_clock = scc_cnt = 0;
    for (int i = 0;i < 2*n;i++)
        if (!dfn[i]) tarjan(i);
    for (int i = 0;i < 2*n;i+=2)
        if (sccnum[i] == sccnum[i+1]) return false;
    return true;
}

void add_edge(int x, int xval, int y, int yval)
{
    x = x*2+xval;
    y = y*2+yval;
    G[x^1].push_back(y);
    G[y^1].push_back(x);
}

bool check(int mid)
{
    for (int i = 0;i < 2*n;i++)
        G[i].clear();
    for (int i = 0;i < n;i++) for (int p1 = 0;p1 < 2;p1++)
    {
        for (int j = i+1;j < n;j++) for (int p2 = 0;p2 < 2;p2++)
        {
            if (abs(a[i][p1]-a[j][p2]) < mid)
                add_edge(i, p1^1, j, p2^1);
        }
    }
    return solve();
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);
    while(cin >> n)
    {
        int l = 0, r = 0;
        for (int i = 0;i < n;i++)
        {
            cin >> a[i][0] >> a[i][1];
            r = max(r, max(a[i][0], a[i][1]));
        }
        int ans = 0;
        while(l <= r)
        {
            int mid = (l+r)/2;
            if (check(mid))
            {
                ans = max(ans, mid);
                l = mid+1;
            }
            else
                r = mid-1;
        }
        cout << ans << endl;
    }

    return 0;
}

おすすめ

転載: www.cnblogs.com/YDDDD/p/12141894.html