(Jizhong) 1595. [Formation] GDKOI péages (péage)] [Floyed

(Fichier IO): entrée: toll.in sortie: toll.out
temps limite: 1000 ms contraintes d'espace: 262144 KB restrictions spécifiques
Aller ProblemSet


Titre Description
avec tout le monde, fermier John serait plutôt me apprendre négatif au monde du bétail, le monde du bétail appelé hors de l'esprit négatif de mon grand, jour et nuit en essayant de trouver moyen de faire de l' argent. Pour faire fortune, il a mis en place une série de règles et de règlements de sorte que les vaches marchant dans un péage routier agricole doivent être tournées vers fermier John.

Ferme par N (1 <= N <= 250), pré (numérotés de 1 à N), et a un M (1 <= M <= 10000) liaison routière bidirectionnelle herbe A_j et B_j (1 <= A_j <= N, 1 <= B_j <= N). Les vaches peuvent atteindre tout écart par une d'une prairie d'herbe. FJ a fourni une route à péage est connecté sur une L_j A_j et B_j bidirectionnel (1 <= L_j <= 100 000).

nombre possible de routes reliant les deux mêmes prairies, mais il n'y a pas de route reliant une herbe pré et cela lui-même. Les bonnes nouvelles sont que la plupart des vaches de toute une pelouse, à travers une série de chemins, vous pouvez toujours arriver à une autre d'une prairie.

En plus de l'avidité, nous ne savons pas quoi dire. FJ même dans chacun de ce qui précède est également pourvu d'une pré sonne C_i (1 <= C_i <= 100 000). D'un pré herbeux à un autre morceau du coût, il est le résultat de tous les péages routiers et les péages maximum, plus tout le passage d'herbe (y compris début et à la fin) de.

bovins de travail dur qui veulent enquêter sur ce qu'ils devraient choisir cette voie. Ils veulent que vous écriviez un programme qui accepte K (1 <= K <= 10 000) problème et le coût minimum par sortie correspondant au défi. Le i-ième question comprend deux chiffres et de S_I t_i (1 <= S_I <= N, 1 <= t_i <= N = ;! S_i t_i), indiquant le début et la fin de la pelouse.

Considérons l'exemple suivant d' image comprenant cinq herbe: à
Insérer ici l'image Description
partir d' une route à une herbe de prairie côté 3 » de péage « 3 », point de péage « herbages 2 à 5.

1 viennent de la pelouse 4, peut venir de la pelouse 13, puis est allé à la pelouse d'herbe 4 5 enfin arrivé. Si oui aller, le besoin "péages" côté est 2 + 1 + 1 = 4, les points doivent péages 4 (points herbe 5 péages maximum), de sorte que le coût total est de 4 + 4 = 8.

Le meilleur itinéraire est de 2 à 3 gazon de la pelouse 2, 5 sont arrivés dans l'herbe, l'herbe et enfin à 3. Alors, allez, les péages pour le bord 3 + 1 = 4, 5 points - le péage est un coût total de 5 + 4 = 9.


Entrée
Ligne 1: trois espaces séparés entiers: N, M et K
second à N + 1 ligne: première ligne i + 1 contient un seul entier: c_i
de la première à N + 2 N + M + 1 : ligne j + N + 1 ligne contient trois entiers séparés par des espaces: A_j, B_j L_j et
les N + M + 2 inversé première N + M + K + 1: la ligne I + N + M + 1 lignes désigne la i ème question comprend deux parties séparées par un nombre entier et S_I t_i

Les sorties
de la première à la ligne K: la i-ième ligne contient un entier représentant le coût minimal à S_I du t_i.


entrée d' échantillon
. 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
. 4 1.
2. 3

Exemple de sortie
. 8
9.


Limite de la plage de données


idées de résolution de problèmes
problème du plus court chemin multi-source, une petite gamme de données, il est clair que vous pouvez utiliser F l la et floyd algorithme de processus,
étant donnéle cheminplus courtrapporte au point maximum de la voie, alors commentétape de décision de changement d'état rapide,résultats du point de poids de chemin maximale est la prisecompte de base de cette question. Si le droit à énumèrent points, la complexité est clairementexplosion.
Nous rappelonsnouveaunouveau F l la et floyd fonctionne algorithme:
I j, il existe deux possibilités: directement et parintermédiaire des interfaces intermédiaires k k , prend m je n moi sur la ligne
nous voulons regarder plus loin versbas mince, k k représente le milieu de l'interface, et k k L' ordreénumération est arbitraire?
Manifestement arbitraire! Une percée en ceci: que nous pouvons modifier les Capricieux k k ordre d'énumération! Par conséquent, cette question sera résolue.
Nous exploitonspoids de petite à grande renumérotation,qui est un point de transit k k représentants est renumérotés points, k k plus, plus le point droit
nousjuste besoin de énumèrent petit augrand point de transit k k , parce que la k k est l'énumération des petites et grandes
nous recherchons je , j i, j de cheminplus court entre nouspointtransit, si seulement Enumérer k k ,qui explique notre courant je , j i, j le plus court entre le pas droit à un peu plus de k k grand petit coin droit dernier k k -dire que je - > j i-> j En plus de la voie je , j i, j maximale extérieure pointdroite,
puis à exécuter peut F l et la Flyod point de maximum sur la trajectoire est droite je , j , k i, j, k trois pointsdroit au milieu de la valeur maximale!


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]]);
    }
}
Publié 119 articles originaux · a gagné les éloges 8 · vues 4910

Je suppose que tu aimes

Origine blog.csdn.net/kejin2019/article/details/104978499
conseillé
Classement