羅区P4878 [USACO05DEC]レイアウト

羅区P4878 [USACO05DEC]レイアウト

説明

  • 他の種と同じように、牛のようにも彼らの友人と一緒に入れたときにDafanをラインアップしたいです。FJは1頭の... N N牛(2≤N≤1000)が番号が付けられています。最初に、牛は番号順に並びます。牛は非常に不器用なので、同じ位置に牛があるかもしれません。

    いくつかの牛は友達をベースとしている、彼らは特定の数よりも少ない互いに等しい距離を求めています。いくつかの牛のライバルは、彼らは互いの間の距離が数以上欲しいです

    MLグループIDが良い友達に与えられ、そして別のはるかに少ない一方との間、それらの所望の距離であり、そしてMD番号ライバルの数が与えられ、それらはお互い(1≤ML、MD≤10から以上の距離を希望します4番目)

    計算:上記のすべての条件が満たされる場合、N 1および牛最大数牛数との間の距離。

入力

  • 最初の行:スペースで区切られた3つの整数N、ML、MD、。

    2 ... ML +行の1:スペースで区切られた三つの整数各列A、B、D、数≤Dことが、牛の牛をAとBとの間の距離を表します。6、1≤D≤10のパワー1≤A<B≤Nを確実にするために

    第ML + 2 ... ML + MD + 1行:三つの整数スペースで区切られた各列A、B、D、数≥Dことが、牛の牛をAとBとの間の距離を表します。6、1≤D≤10のパワー1≤A<B≤Nを確実にするために

出力

  • ライン、整数。プログラムが有効でない場合、出力-1がある場合に正規のプログラム、第1号が、離れて無限と牛牛の数N、出力する-2。そうでない場合、出力111頭の牛や乳牛番号NNN間の最大距離。

サンプル入力

4 2 1
1 3 10
2 4 20
2 3 3

サンプル出力

27

ソリューション:

  • 微分制約。
  • この問題は、私は、差動制約の新しい理解しているせます。
  • その質問ならば2つの問題があります。1:解けるです。2:出力しない、無限大です最大距離
  • 最初の質問のためにあなたの姿を鳴らすが、実際に存在するかどうかを尋ねることです。コネクティビティマップ、もちろん、接続されていない無限(無限に多くのソリューションが)、それは出力の最大距離と通信できるかどうかを2つ目の質問は、実際にあなたを求めています。
  • リフレクション差動制約が前にしました。問題は2つの要素間の関係に特異的であることを除いて。今回は、スーパーソースを構築することはできません。あなたが通信していない場合ので、図のソースは、スーパー図の通信に追加されます。2つの要素間のこのような関係は、ほとんど元の状態ではありません。
  • だから、もう一度差制約をまとめました。
    1. 観察は、質問が最大または最小のために努力することです頼みますか?
      • 最大:不等式形態のX <= Yの+ cに統一。図構造:(Y、C、X)を加えます。最短ラン。
      • 分:フォームの不等式X> = Yの+ cに統一。図構造:(Y、C、X)を加えます。彼は道を駆け上がりました。
    2. 観察面が求めている質問のどのタイプの質問ですか?
      • 実現可能性:スーパーソースの確立は、リングを宣告しました。
      • 一般答え:スーパーソースをビルドし、実行しspfa
      • 狭い答え(二つの要素に固有):あなたはスーパーソースを構築することはできませんが、一点からspfaを走りました
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#define N 200005
using namespace std;

struct E {int next, to, dis;} e[N];
int n, m1, m2, num;
int h[N], dis[N], cnt[N];
bool vis[N];

int read()
{
    int x = 0; char c = getchar();
    while(c < '0' || c > '9') c = getchar();
    while(c >= '0' && c <= '9') {x = x * 10 + c - '0'; c = getchar();}
    return x;
}

void add(int u, int v, int w)
{
    e[++num].next = h[u];
    e[num].to = v;
    e[num].dis = w;
    h[u] = num;
}

int spfa(int s)
{
    queue<int> que;
    memset(dis, 0x3f, sizeof(dis));
    memset(vis, 0, sizeof(vis));
    dis[s] = 0, vis[s] = 1, que.push(s);
    while(!que.empty())
    {
        int now = que.front();
        cnt[now]++;
        if(cnt[now] >= n) return -1;
        que.pop();  vis[now] = 0;
        for(int i = h[now]; i != 0; i = e[i].next)
            if(dis[now] + e[i].dis < dis[e[i].to])
            {
                dis[e[i].to] = dis[now] + e[i].dis;
                if(!vis[e[i].to])
                    vis[e[i].to] = 1, que.push(e[i].to);
            }
    }
    if(dis[n] - dis[1] == 0x3f3f3f3f) return -2;
    else return dis[n] - dis[1];
}

int main()
{
    cin >> n >> m1 >> m2;
    for(int i = 1; i <= m1; i++)
    {
        int a = read(), b = read(), c = read();
        add(a, b, c);
    }
    for(int i = 1; i <= m2; i++)
    {
        int a = read(), b = read(), c = read();
        add(b, a, -c);
    }
    for(int i = 1; i <= n; i++) add(n + 1, i, 0);
    if(spfa(n + 1) == -1) {cout << -1; return 0;}
    else cout << spfa(1);
    return 0;
}

おすすめ

転載: www.cnblogs.com/BigYellowDog/p/11232888.html