제출 #1333490

#제출 시각아이디문제언어결과실행 시간메모리
1333490Gabriel새로운 문제 (POI11_met)C++20
0 / 100
6079 ms79948 KiB
#include "bits/stdc++.h"
using namespace std;
struct Arista{
    int u, v, ID_opuesto;
    long long Capacidad, Flujo, Costo;
};
vector<Arista> Lista;
vector< vector<int> > Grafo;
vector<long long> Distancias, Potenciales;
int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    int n, m, k;
    long long r, t, DOS = 2222222222222222;
    cin>>n>>m>>r>>t>>k;
    //cerr<<t / r<<"\n\n";
    Grafo.assign(n + m + 22, {});
    Potenciales.assign(n + m + 22, 0);
    Distancias.assign(n + m + 22, DOS);
    int ID = 0;
    for(int i = 0; i < k; i++){
        int a, b;
        cin>>a>>b;
        a--;
        b = b - 1 + n;
        Grafo[a].push_back(ID);
        Grafo[b].push_back(ID + 1);
        Lista.push_back({a, b, ID + 1, 1, 0, 1});
        Lista.push_back({b, a, ID, 0, 0, -1});
        ID += 2;
    }
    for(int i = 0; i < n; i++){
        Grafo[n + m + 2].push_back(ID);
        Grafo[i].push_back(ID + 1);
        Lista.push_back({n + m + 2, i, ID + 1, t / r, 0, 1});
        Lista.push_back({i, n + m + 2, ID, 0, 0, -1});
        ID += 2;
    }
    for(int i = n; i < n + m; i++){
        Grafo[i].push_back(ID);
        Grafo[n + m + 4].push_back(ID + 1);
        Lista.push_back({i, n + m + 4, ID + 1, 1, 0, 1});
        Lista.push_back({n + m + 4, i, ID, 0, 0, -1});
        ID += 2;
    }
    long long Flujo_m_ximo = 0, Costo_m_nimo = 0;
    while(1){
        Distancias[n + m + 2] = 0;
        priority_queue< pair<long long, int>, vector< pair<long long, int> >, greater< pair<long long, int> > > Cola;
        Cola.push({0, n + m + 2});
        vector< pair<int, int> > Ancestros(n + m + 22, {-2, -2});
        vector<long long> Flujo_mandado(n + m + 22, 0);
        Flujo_mandado[n + m + 2] = LLONG_MAX;
        while(!Cola.empty()){
            /*for(auto E: Distancias) cerr<<E<<" ";
            cerr<<"\n";*/
            for(auto E: Flujo_mandado) cerr<<E<<" ";
            cerr<<"\n";
            int Nodo = Cola.top().second;
            Cola.pop();
            for(auto E: Grafo[Nodo]){
                auto Siguiente = Lista[E];
                //cerr<<Nodo<<" "<<Siguiente.v<<" ";
                if(Siguiente.Flujo >= Siguiente.Capacidad){
                    //cerr<<"No se puede pasar.\n";
                    continue;
                }
                long long Distancia = Distancias[Nodo] + Siguiente.Costo + Potenciales[Siguiente.v] - Potenciales[Nodo];
                if(Distancia >= Distancias[Siguiente.v]){
                    //cerr<<Distancia<<" "<<Distancias[Siguiente.v]<<" Muy lejos.\n";
                    continue;
                }
                //cerr<<Nodo<<" "<<Siguiente.v<<" "<<Siguiente.Flujo<<" "<<Siguiente.Capacidad<<" "<<Distancia<<"\n";
                Distancias[Siguiente.v] = Distancia;
                Cola.push({Distancia, Siguiente.v});
                Ancestros[Siguiente.v] = {Nodo, E};
                Flujo_mandado[Siguiente.v] = Siguiente.Capacidad - Siguiente.Flujo;
            }
        }
        //cerr<<"\n";
        if(Flujo_mandado[n + m + 4] == 0) break;
        for(int Nodo = n + m + 4; Nodo != n + m + 2; Nodo = Ancestros[Nodo].first){
            cerr<<Nodo<<" ";
            Flujo_mandado[n + m + 2] = min(Flujo_mandado[n + m + 2], Flujo_mandado[Nodo]);
        }
        cerr<<"\n";
        Flujo_m_ximo += Flujo_mandado[n + m + 2];
        for(int Nodo = n + m + 4; Nodo != n + m + 2; Nodo = Ancestros[Nodo].first){
            Lista[Ancestros[Nodo].second].Flujo += Flujo_mandado[n + m + 2];
            Lista[Lista[Ancestros[Nodo].second].ID_opuesto].Flujo -= Flujo_mandado[n + m + 2];
            if(Ancestros[Nodo].first == n + m + 2){
                Lista[Ancestros[Nodo].second].Costo += Flujo_mandado[n + m + 2];
                Lista[Lista[Ancestros[Nodo].second].ID_opuesto].Costo -= Flujo_mandado[n + m + 2];
            }
        }
        for(int i = 0; i < n + m + 22; i++){
            if(Distancias[i] != DOS) Potenciales[i] += Distancias[i];
            Distancias[i] = DOS;
            cerr<<Potenciales[i]<<" ";
        }
        cerr<<"\n";
    }
    for(auto E: Lista) Costo_m_nimo += (E.Flujo * E.Flujo + E.Flujo) / 2;
    cout<<Flujo_m_ximo<<" "<<Costo_m_nimo<<"\n";
    for(int i = 0; i < n; i++){
        long long Contador = 0;
        for(auto E: Grafo[i]){
            auto Siguiente = Lista[E];
            if(Siguiente.Flujo != 1) continue;
            cout<<i + 1<<" "<<Siguiente.v - n + 1<<" "<<Contador * r<<"\n";
            Contador++;
        }
    }
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...