155592025-02-20 12:35:57AblablablaAutópálya inflációcpp17Elfogadva 100/1001.19s1632 KiB
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

const ll MOD = 1e9 + 7;
const int MAXN = 3000;

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

struct ut{
    int elozo, ind, suly, hossz;
};

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

vector<ut> utak[MAXN];

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){
        ut akt1 = utak[a][b], akt2 = utak[c][d];

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

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

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

            elso.suly = 0;
            a = akt1.elozo;
            b = akt1.ind;
            egy--;

            masod.suly = 0;
            c = akt2.elozo;
            d = akt2.ind;
            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";
        ut egy = utak[akt][ind];

        vissza = ((vissza*2) % MOD + egy.suly) % MOD;

        akt = egy.elozo;
        ind = egy.ind;
    }

    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().hossz <= 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
2Elfogadva26ms1156 KiB
subtask28/8
3Elfogadva8ms908 KiB
4Elfogadva19ms916 KiB
5Elfogadva10ms1012 KiB
6Elfogadva7ms820 KiB
7Elfogadva56ms876 KiB
subtask315/15
8Elfogadva1ms500 KiB
9Elfogadva1ms316 KiB
10Elfogadva1ms316 KiB
11Elfogadva1ms332 KiB
12Elfogadva1ms316 KiB
13Elfogadva1ms316 KiB
14Elfogadva1ms316 KiB
15Elfogadva1ms316 KiB
16Elfogadva1ms316 KiB
17Elfogadva1ms316 KiB
18Elfogadva1ms316 KiB
subtask434/34
19Elfogadva17ms1076 KiB
20Elfogadva54ms956 KiB
21Elfogadva59ms1048 KiB
22Elfogadva32ms1012 KiB
23Elfogadva28ms964 KiB
24Elfogadva105ms820 KiB
25Elfogadva12ms1076 KiB
26Elfogadva8ms1308 KiB
27Elfogadva94ms872 KiB
28Elfogadva20ms820 KiB
29Elfogadva26ms832 KiB
30Elfogadva61ms820 KiB
31Elfogadva45ms936 KiB
32Elfogadva158ms996 KiB
33Elfogadva160ms820 KiB
subtask521/21
34Elfogadva4ms564 KiB
35Elfogadva7ms756 KiB
36Elfogadva6ms564 KiB
37Elfogadva6ms564 KiB
38Elfogadva4ms748 KiB
39Elfogadva4ms556 KiB
40Elfogadva67ms708 KiB
41Elfogadva56ms644 KiB
42Elfogadva2ms748 KiB
43Elfogadva3ms756 KiB
44Elfogadva3ms564 KiB
45Elfogadva3ms564 KiB
46Elfogadva2ms564 KiB
47Elfogadva2ms564 KiB
48Elfogadva4ms564 KiB
49Elfogadva4ms564 KiB
subtask622/22
50Elfogadva27ms972 KiB
51Elfogadva26ms1056 KiB
52Elfogadva27ms1076 KiB
53Elfogadva21ms1172 KiB
54Elfogadva13ms1124 KiB
55Elfogadva13ms1116 KiB
56Elfogadva1.19s1588 KiB
57Elfogadva833ms1632 KiB
58Elfogadva7ms564 KiB
59Elfogadva14ms892 KiB
60Elfogadva16ms860 KiB
61Elfogadva19ms820 KiB
62Elfogadva20ms1004 KiB
63Elfogadva13ms852 KiB
64Elfogadva68ms916 KiB
65Elfogadva68ms840 KiB
66Elfogadva196ms860 KiB