155552025-02-20 12:29:44AblablablaAutópálya inflációcpp17Időlimit túllépés 78/1002.099s1888 KiB
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

const ll MOD = 1e9 + 7;

struct pont{
    int akt, elozo, ind, suly, hossz;
};

vector<vector<vector<int>>> utak; // elozo, ind, suly, hossz

ll kulonbseg(pont elso, pont masod){
    int egy = elso.hossz, ket = masod.hossz;
    ll kul = 0; // a - b

    int a = elso.elozo, b = elso.ind, c = masod.elozo, d = masod.ind;

    while(egy > 0 || ket > 0){
        vector<int> akt1 = utak[a][b], akt2 = utak[c][d];

        if(egy > ket){ // egyben messzebb vagyunk
            kul = (kul - elso.suly)*2 - akt1[2];

            elso.suly = 0;
            a = akt1[0];
            b = akt1[1];
            egy--;
        } else if(egy < ket){
            kul = (kul + masod.suly)*2 + akt2[2];

            masod.suly = 0;
            c = akt2[0];
            d = akt2[1];
            ket--;
        } else{
            kul = (kul - elso.suly + masod.suly)*2 - akt1[2] + akt2[2];

            elso.suly = 0;
            a = akt1[0];
            b = akt1[1];
            egy--;

            masod.suly = 0;
            c = akt2[0];
            d = akt2[1];
            ket--;
        }

        if(kul < -2e9 || 2e9 < kul) return kul;
    }

    kul += masod.suly - elso.suly;

    return kul;
}

struct comp{
    bool operator()(pont a, pont b){
        ll c = kulonbseg(a, b);

        if(c < 0){ // a - b < 0
            return 1;
        } else if(c > 0){
            return 0;
        } else{
            return a.hossz > b.hossz;
        }
    }
};

ll leker(int akt, int ind){
    ll vissza = 0;

    while(akt != 0){

        //cout << akt << " " << ind << "\n";
        vector<int> egy = utak[akt][ind];

        vissza = ((vissza*2) % MOD + egy[2]) % MOD;

        akt = egy[0];
        ind = egy[1];
    }

    return vissza;
}

int main(){
    int n, m;
    cin >> n >> m;

    vector<vector<int>> csucsok(n, vector<int>()), elSuly(n, vector<int>());
    for(int i = 0; i < m; i++){
        int a, b, c;
        cin >> a >> b >> c;
        a--; b--;

        csucsok[a].push_back(b);
        elSuly[a].push_back(c);
        csucsok[b].push_back(a);
        elSuly[b].push_back(c);
    }


    priority_queue<pont, vector<pont>, comp> bejar;
    bejar.push({0, 0, 0, 0, 0});

    utak.assign(n, vector<vector<int>>());

    vector<int> ans(n, 0);

    while(!bejar.empty()){
        pont egy = bejar.top();
        bejar.pop();

        int akt = egy.akt;
        //cout << akt << "\n";

        if(!utak[akt].empty() && utak[akt].back()[3] <= egy.hossz) continue;

        //cout << "atjut\n";

        utak[akt].push_back({egy.elozo, egy.ind, egy.suly, egy.hossz});

        if(utak[akt].size() == 1){
            ans[akt] = leker(akt, 0);
            //cout << akt << " " << ans[akt] << "\n";
        }

        for(int i = 0; i < csucsok[akt].size(); i++){
            bejar.push({csucsok[akt][i], akt, utak[akt].size() - 1, elSuly[akt][i], egy.hossz + 1});
        }
    }

    for(int i = 1; i < n; i++){
        cout << ans[i] << "\n";
    }
}
RészfeladatÖsszpontTesztVerdiktIdőMemória
subtask10/0
1Elfogadva1ms316 KiB
2Elfogadva109ms1188 KiB
subtask28/8
3Elfogadva43ms820 KiB
4Elfogadva123ms820 KiB
5Elfogadva37ms908 KiB
6Elfogadva24ms1000 KiB
7Elfogadva149ms824 KiB
subtask315/15
8Elfogadva1ms316 KiB
9Elfogadva1ms316 KiB
10Elfogadva1ms316 KiB
11Elfogadva1ms316 KiB
12Elfogadva1ms316 KiB
13Elfogadva1ms328 KiB
14Elfogadva1ms316 KiB
15Elfogadva1ms316 KiB
16Elfogadva1ms316 KiB
17Elfogadva1ms332 KiB
18Elfogadva1ms316 KiB
subtask434/34
19Elfogadva86ms908 KiB
20Elfogadva361ms928 KiB
21Elfogadva425ms916 KiB
22Elfogadva209ms988 KiB
23Elfogadva194ms1136 KiB
24Elfogadva541ms1076 KiB
25Elfogadva50ms1080 KiB
26Elfogadva32ms1232 KiB
27Elfogadva597ms820 KiB
28Elfogadva112ms864 KiB
29Elfogadva134ms820 KiB
30Elfogadva351ms820 KiB
31Elfogadva250ms1012 KiB
32Elfogadva885ms888 KiB
33Elfogadva893ms820 KiB
subtask521/21
34Elfogadva8ms508 KiB
35Elfogadva32ms564 KiB
36Elfogadva25ms564 KiB
37Elfogadva25ms576 KiB
38Elfogadva17ms564 KiB
39Elfogadva17ms564 KiB
40Elfogadva523ms616 KiB
41Elfogadva449ms564 KiB
42Elfogadva4ms316 KiB
43Elfogadva7ms316 KiB
44Elfogadva7ms316 KiB
45Elfogadva7ms316 KiB
46Elfogadva6ms316 KiB
47Elfogadva8ms316 KiB
48Elfogadva14ms316 KiB
49Elfogadva14ms496 KiB
subtask60/22
50Elfogadva87ms1080 KiB
51Elfogadva105ms1080 KiB
52Elfogadva112ms972 KiB
53Elfogadva90ms1076 KiB
54Elfogadva41ms1076 KiB
55Elfogadva41ms1260 KiB
56Időlimit túllépés2.099s1800 KiB
57Időlimit túllépés2.099s1888 KiB
58Elfogadva25ms564 KiB
59Elfogadva50ms820 KiB
60Elfogadva59ms820 KiB
61Elfogadva79ms820 KiB
62Elfogadva71ms820 KiB
63Elfogadva59ms820 KiB
64Elfogadva340ms820 KiB
65Elfogadva335ms820 KiB
66Elfogadva1.057s820 KiB