(Jizhong) 1595. [Training] GDKOI Maut (Maut)] [Floyed

(File IO): Eingang: toll.in Ausgang: toll.out
Zeitlimit: 1000 ms Platzbeschränkungen: 262144 KB spezifische Beschränkungen
Goto ProblemSet


Titel Beschreibung
mit allen anderen, Farmer John würde mich eher lehrt negativ auf die Welt Rinder, die Welt der Rinder aus dem negativen Geist meines großen, Tag und Nacht genannt versucht, Geld zu verdienen kommen Weg. Um ein Vermögen zu machen, setzte er eine Reihe von Regeln und Vorschriften , so dass alle Kühe in einer Bauernhof von Straßenbenutzungsgebühren gehen sollen über Farmer John gedreht werden.

Farm von N (1 <= n <= 250) Wiese (nummeriert von 1 bis N), und hat ein M (1 <= M <= 10000) bidirektionales Straßenverbindung Gras A_j B_j und (1 <= A_j <= N; 1 <= B_j <= N). Die Kühe können jede Abweichung von einem beliebigen einer grünen Wiese erreichen. FJ hat eine Mautstraße ist über eine bidirektionale L_j A_j und B_j von (1 <= L_j <= 100.000) verbunden ist.

Mögliche Anzahl von Straßen, die die gleichen zwei Wiesen verbinden, aber es gibt keine Straße eine Wiese Gras und dies selbst zu verbinden. Die gute Nachricht ist, dass die meisten Kühe von einem Rasen, durch eine Reihe von Wegen, können Sie immer andere von einer Wiese erreichen.

Neben der Gier, wissen wir nicht, was ich sagen soll. FJ auch in jedem der oben ist auch mit einer Wiese vorgesehen Maut C_I (1 <= C_I <= 100000). Von einer grünen Wiese zu einem anderen Stück der Kosten, ist es das Ergebnis aller Straßenbenutzungsgebühren und die maximalen Maut plus alle Gras Gang (einschließlich Start- und Ende).

Fleißig Rinder, die untersuchen wollen, was sie sollten diesen Weg wählen. Sie wollen ein Programm schreiben, die K (1 <= K <= 10.000) Problem und die minimalen Kosten pro Ausgang auf die Herausforderung entsprechenden akzeptiert. Die i-te Frage besteht aus zwei Zahlen und s_i t_i (1 <= s_i <= N; 1 <= t_i <= N ;! S_i t_i =), Anfang und Ende des Rasens zeigen.

Betrachten Sie die folgende Beispielbild aus fünf Gras:
Hier hat Bild einfügen Beschreibung
von einer Straße auf eine Rispengras 3 ‚Seite des Maut‚3,‘Mautstelle„Grünland 2 bis 5.

1 kommen aus dem Rasen 4, 13 aus dem Rasen kommen und ging dann zum Rasen 4 5 endlich angekommen. Wenn dies der Fall gehen, müssen "side Maut" 2 + 1 + 1 = 4, müssen Punkte maut 4 (Grass Punkt 5 Maut maximal), so dass die Gesamtkosten 4 + 4 = 8.

Der beste Weg 2 bis 3 Rasen Gras aus dem Rasen 2, kamen 5 im Gras, Gras und schließlich bis 3. So geht, Maut für den Rand 3 + 1 = 4, 5 Punkte - die Maut ist eine Gesamtkosten von 5 + 4 = 9.


Eingang
Zeile 1: drei Räume getrennt sind ganze Zahlen: N, M und K
zweiten bis N + 1 Zeile: erste Zeile i + 1 eine einzelne ganze Zahl enthält: C_I
des ersten N + 2 bis N + M + 1 : Zeile j + N + 1 - Zeile enthält drei ganzen Zahlen durch Leerzeichen getrennt: A_j, B_j L_j und
die erste N + M + 2 invertierten ersten N + M + K + 1: Linie i + N + M + 1 Reihen bezeichnet die i - te Frage umfasst zwei Räume durch eine ganze Zahl und s_i t_i abgetrennt

Die Ausgänge
der ersten bis K - Linie: die i-te Zeile enthält eine einzelne ganze Zahl ist , die minimalen Kosten zu s_i vom t_i darstellt.


Probeneingabe
. 5. 7 2
2
. 5
. 3
. 3
. 4
. 1. 2. 3
. 1. 3 2
2 5 3
. 5. 3. 1
. 5. 1. 4
2. 4. 3
. 3. 4. 4
. 1. 4
2 3

Beispielausgabe
. 8
. 9


Datenbereichsgrenze


Ideen zur Problemlösung
Multi-Source kürzester Weg Problem, eine kleine Auswahl an Daten ist es klar , dass Sie verwenden können , f l die und d floyd - Algorithmus zu verarbeiten,
da der kürzeste Weg in dem rechten Weg zu dem Maximalpunkt bezieht, so wie schnell Zustandsübergangsentscheidungsstufe führt zu dem Punkt des maximalen Pfadgewichtes ist der Kern Betrachtung dieser Frage. Wenn jeder richtige Stelle aufzuzählen, ist die Komplexität deutlich Explosion.
Wir erinnern uns noch einmal wieder f l die und d floyd Algorithmus arbeitet:
I bis J, gibt es zwei Möglichkeiten: direkt und mittels der Zwischenschnittstellen k k , nimmt ein m ich n mir auf der Linie
wir weiter unten dünn aussehen wollen, k k repräsentiert die Mitte der Schnittstelle und k k - Enumeration Reihenfolge ist willkürlich?
Offensichtlich willkürlich! Ein Durchbruch in dieser: dass wir die mutwilligen ändern k k Aufzählung Bestellung! Daher wird diese Frage gelöst.
Wir tippen Gewichte von klein bis groß Umnummerierung, die ein Transitland ist k k Vertreter ist Punkt neu nummeriert, k k größer, desto größerder richtige Punkt
müssen nur kleine bis große Transitpunkt aufzuzählen wir k k , weil die k k ist die Aufzählung von klein bis groß
suchen wir ich . j i, j kürzesten Weg zwischen, wir Transitpunkt, wennnur aufzuzählen k k , dieunserem aktuellen erklärt ich . j i, j zwischen die kein Recht auf ein wenig mehr als kürzeste k k große Fleckchen rechts letzten k k d.h. als ich - > j i-> j Neben dem Pfad ich . j i, j maximalen äußeren rechten Punkt,
und dann kann laufen f l und die d flyod Maximalpunkt auf dem Weg ist der richtige ich . j . k i, j, k drei Punkte rechts auf den Mittelpunkt des Maximalwertes!


Code

#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
#include<algorithm>
#include<iomanip>
#include<cmath>
using namespace std;
const int INF=0x3f3f3f3f;
int n,m,K,b[260],p,q,dis[260][260],ans[260][260];
struct c{
    int x,y;
}a[260];
bool cmp(const c&l,const c&r){
    return l.x<r.x;
}
int main(){
   freopen("toll.in","r",stdin);
   freopen("toll.out","w",stdout);
    scanf("%d%d%d",&n,&m,&K);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a[i].x);
        a[i].y=i;
    }
    sort(a+1,a+n+1,cmp);
    for(int i=1;i<=n;i++)
        b[a[i].y]=i;
    memset(dis,INF,sizeof(dis));
    for(int i=1;i<=n;i++)
        dis[i][i]=0;
    for(int i=1;i<=m;i++)
    {
        int u,v,w;
        scanf("%d%d%d",&u,&v,&w);
        dis[b[u]][b[v]]=dis[b[v]][b[u]]=min(dis[b[u]][b[v]],w);
    }
    memset(ans,INF,sizeof(ans));
    for(int k=1;k<=n;k++)
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
            {
                if(i==j)
                 continue;
               dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
              if(dis[i][j]==dis[i][k]+dis[k][j])
                    ans[i][j]=min(ans[i][j],dis[i][j]+max(a[i].x,max(a[j].x,a[k].x)));
                    
            }
    for(int i=1;i<=K;i++)
    {
         scanf("%d%d",&p,&q);
         printf("%d\n",ans[b[p]][b[q]]);
    }
}
Veröffentlicht 119 Originalarbeiten · erntete Lob 8 · Ansichten 4910

Ich denke du magst

Origin blog.csdn.net/kejin2019/article/details/104978499
Empfohlen
Rangfolge