USACOミルクルーティング

羅区P3063 [USACO12DEC]ミルクミルクルーティングルーティング

羅区ポータル

JDOJ 2334:USACO 2012 12月シルバー3.Milkルーティング

JDOJポータル

説明

問題3:ミルクルーティング[ブライアン・ディーン、2012]

ファーマージョンの農場はのためのMパイプ(1 <= M <= 500)の旧式のネットワーク持っている
彼のミルク貯蔵タンクに納屋から牛乳をポンピングします。彼は、除去したい
と来年にかけてこれらのほとんどを更新したが、彼は正確に残すことを望んでいる
彼はまだから牛乳をポンピングすることができるように、完全なパイプの1パス分を
貯蔵タンクへの納屋。

パイプネットワークは、それぞれのN個の接続点(1 <= N <= 500)によって記載されている
パイプの組のエンドポイントとして機能することができます。接続点1は、
納屋、及び接続点Nは、貯蔵タンクです。Mの各
双方向パイプは、接合点の対の間に実行され、そして持ち
関連する待ち時間(それの一端に到達するために乳にかかる時間の量
、他のパイプ)と容量(単位時間あたりのミルクの量を
それは)定常状態でパイプを通してポンプ輸送することができます。複数のパイプは、
接合点の同一の対の間に接続することができます。

タンクに納屋から接続管の経路のために、レイテンシー
パスのパスに沿ってパイプの待ち時間の和であり、
パスの容量の容量の最小である
(パスに沿ってパイプこれは制約「ボトルネック」であるので、
ミルクはパスを介してポンピング可能な全体的な速度で)。FJの場合
とパイプの経路を介してミルクのX単位の合計を送信したい
レイテンシーL及び容量C、これにかかる時間は、したがって、L + X / Cです。

FJのパイプネットワークの構造を考えると、彼は単一選択助けてください
、彼はX単位圧送することを可能にする貯蔵タンクへの納屋からのパス
の合計時間の最小量の牛乳のを。

入力

* 1行目:スリースペースで区切られた整数:NMX(1 <=のX <= 1,000,000)。

*行2..1 + M:各行は4つの整数用いてパイプを記述する:IJL C.
I及びJ(1 <= I、J <= N)は、両端の接合点である
管。LとC(1 <= L、C <= 1,000,000)のレイテンシを与える
パイプのと容量。

出力

* 1行目:それは牛乳を送信するためにFJを取る時間の最小量
の単一の経路に沿って、最も近い整数に切り捨て。

サンプル入力

3 3 15 1 2 10 3 3 2 10 2 1 3 14 1

サンプル出力

27

ヒント

INPUTの詳細:

FJは、彼のパイプネットワークを通じて牛乳の15個の単位を送りたいです。管#1は、
接続点2に接続点1(納屋)を接続し、待ち時間有する
10および3パイプ#2及び#3の容量は同様に定義されます。

OUTPUTの詳細:

パス1-> 3は、時間の14 + 15/1 = 29単位を取ります。パス1-> 2->図3は、かかる
時間の20 + 15/2 = 27.5単位、したがって最適です。

タイトル翻訳:

ファーマージョンは古いファームネットワーク、納屋からミルク貯蔵タンクに搬送ミルクのために構成さM(1 <= M <= 500)のパイプラインネットワークを設定します。彼は削除し、来年中にパイプラインのほとんどを更新したかったが、彼は完全なパスをそのまま維持したいので、彼はまだミルクタンクに納屋から輸送することができます。

N個のノード(1 <= N <= 500)からなるネットワークは、各ポイントは、パイプの端部として設定することができます。ノード1はノードNがタンクである、納屋です。物品M双方向導管ノードの各接続対、及び(単位時間当たりの乳量はパイプラインによって安定化することができる)位相差値(乳管の他方の端部に到達)し、容量値を有しています。複数のパイプは、同じノードに接続されてもよいです。

遅延パスの遅延およびすべてのパイプに沿って等しい納屋にタンクを接続するパスを、パスの容量は、ダクトに沿って最小容量(それは制限されているので、ミルク輸送「ボトルネック」)に等しいです。ジョンは、遅延L、乳管Cの単位Xの輸送能力によって、時間はL + X / Cのために必要な場合

ジョンはネットワーク構造を与え、彼は貯蔵タンクに納屋からミルクの単位の少なくともX数の合計時間を運搬するように、彼は道を選ぶ助けてください。

ソリューション:

最短変形タイトルグラフ理論。

私はそれが間違っていた質問の意味は、それに簡単な緩和時間がないと思います。この質問は、あなたがCでCは、実際にパス全体の最小値であるパスを計算するその時間をピット。

だから我々は、直接子供を確定することはできません。

我々は最短実行時間を解決する方法その時は、それを維持することができますか?

私が好きな直感的なポイントは、我々は実行可能な最小時間たび緩和を維持することができます。

だから我々はそれが常に更新することができるように、テンプレートSPFA年代のそれの緩和時間の目的は、パラメータを追加することができ、と思いましたか?

私たちは、特定の方法は、新しい配列を開くことで実現し、各辺のに必要な時間を節約し、最後の列挙型は、この時間を押したときに列挙SPFAを走ったことができます。

コード:

#include<cstdio>
#include<queue>
#include<algorithm>
#include<cstring>
#pragma GCC optimize(2)
using namespace std;
int n,m,t,ans=1e9;
int tot,to[1001],vall[1001],valc[1001],nxt[1001],head[501],c[501];
int f[501];
bool v[501];
inline int read(){
   int s=0,w=1;
   char ch=getchar();
   while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
   while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
   return s*w;
}
void add(int x,int y,int zl,int zc)
{
    to[++tot]=y;
    vall[tot]=zl;
    valc[tot]=zc;
    nxt[tot]=head[x];
    head[x]=tot;
}
void spfa(int w)
{
    memset(f,0x3f,sizeof(f));
    memset(v,0,sizeof(v));
    queue<int> q;
    q.push(1);
    v[1]=1;
    f[1]=0;
    while(!q.empty())
    {
        int x=q.front();
        q.pop();
        v[x]=0;
        for(int i=head[x];i;i=nxt[i])
        {
            int y=to[i];
            if(f[y]>f[x]+vall[i] && valc[i]>=w)
            {
                f[y]=f[x]+vall[i];
                if(v[y]==0)
                {
                    q.push(y);
                    v[y]=1;
                }
            }
        }
    }
}
int main()
{
    n=read();
    m=read();
    t=read();
    for(int i=1;i<=m;i++)
    {
        int x,y,zl,zc;
        x=read();
        y=read();
        zl=read();
        zc=read();
        add(x,y,zl,zc);
        add(y,x,zl,zc);
        c[i]=zc;
    }
    for(int i=1;i<=m;i++)
    {
        spfa(c[i]);
        ans=min(ans,f[n]+t/c[i]);
    }
    printf("%d",ans);
    return 0;
}

おすすめ

転載: www.cnblogs.com/fusiwei/p/11330890.html