155562025-02-20 12:31:18AblablablaAutópálya inflációcpp17Időlimit túllépés 78/1002.099s1912 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(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);

    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
2Elfogadva98ms1132 KiB
subtask28/8
3Elfogadva39ms1060 KiB
4Elfogadva111ms1012 KiB
5Elfogadva32ms820 KiB
6Elfogadva19ms1076 KiB
7Elfogadva134ms1024 KiB
subtask315/15
8Elfogadva1ms316 KiB
9Elfogadva1ms316 KiB
10Elfogadva1ms316 KiB
11Elfogadva1ms316 KiB
12Elfogadva1ms316 KiB
13Elfogadva1ms316 KiB
14Elfogadva1ms316 KiB
15Elfogadva1ms316 KiB
16Elfogadva1ms316 KiB
17Elfogadva1ms316 KiB
18Elfogadva1ms316 KiB
subtask434/34
19Elfogadva75ms1072 KiB
20Elfogadva328ms912 KiB
21Elfogadva384ms1076 KiB
22Elfogadva190ms968 KiB
23Elfogadva177ms1076 KiB
24Elfogadva500ms1072 KiB
25Elfogadva43ms1076 KiB
26Elfogadva27ms1316 KiB
27Elfogadva540ms856 KiB
28Elfogadva101ms1128 KiB
29Elfogadva120ms820 KiB
30Elfogadva316ms844 KiB
31Elfogadva228ms820 KiB
32Elfogadva814ms1072 KiB
33Elfogadva816ms900 KiB
subtask521/21
34Elfogadva8ms316 KiB
35Elfogadva28ms564 KiB
36Elfogadva21ms568 KiB
37Elfogadva21ms756 KiB
38Elfogadva14ms564 KiB
39Elfogadva14ms564 KiB
40Elfogadva476ms596 KiB
41Elfogadva407ms556 KiB
42Elfogadva4ms316 KiB
43Elfogadva6ms316 KiB
44Elfogadva6ms508 KiB
45Elfogadva6ms492 KiB
46Elfogadva4ms316 KiB
47Elfogadva8ms316 KiB
48Elfogadva13ms316 KiB
49Elfogadva13ms476 KiB
subtask60/22
50Elfogadva81ms1084 KiB
51Elfogadva94ms1268 KiB
52Elfogadva101ms1076 KiB
53Elfogadva81ms1076 KiB
54Elfogadva35ms1260 KiB
55Elfogadva35ms1268 KiB
56Időlimit túllépés2.099s1912 KiB
57Időlimit túllépés2.099s1904 KiB
58Elfogadva21ms564 KiB
59Elfogadva45ms948 KiB
60Elfogadva54ms904 KiB
61Elfogadva71ms820 KiB
62Elfogadva64ms820 KiB
63Elfogadva52ms820 KiB
64Elfogadva307ms1080 KiB
65Elfogadva307ms908 KiB
66Elfogadva962ms820 KiB