155592025-02-20 12:35:57AblablablaAutópálya inflációcpp17Accepted 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";
    }
}
SubtaskSumTestVerdictTimeMemory
subtask10/0
1Accepted1ms316 KiB
2Accepted26ms1156 KiB
subtask28/8
3Accepted8ms908 KiB
4Accepted19ms916 KiB
5Accepted10ms1012 KiB
6Accepted7ms820 KiB
7Accepted56ms876 KiB
subtask315/15
8Accepted1ms500 KiB
9Accepted1ms316 KiB
10Accepted1ms316 KiB
11Accepted1ms332 KiB
12Accepted1ms316 KiB
13Accepted1ms316 KiB
14Accepted1ms316 KiB
15Accepted1ms316 KiB
16Accepted1ms316 KiB
17Accepted1ms316 KiB
18Accepted1ms316 KiB
subtask434/34
19Accepted17ms1076 KiB
20Accepted54ms956 KiB
21Accepted59ms1048 KiB
22Accepted32ms1012 KiB
23Accepted28ms964 KiB
24Accepted105ms820 KiB
25Accepted12ms1076 KiB
26Accepted8ms1308 KiB
27Accepted94ms872 KiB
28Accepted20ms820 KiB
29Accepted26ms832 KiB
30Accepted61ms820 KiB
31Accepted45ms936 KiB
32Accepted158ms996 KiB
33Accepted160ms820 KiB
subtask521/21
34Accepted4ms564 KiB
35Accepted7ms756 KiB
36Accepted6ms564 KiB
37Accepted6ms564 KiB
38Accepted4ms748 KiB
39Accepted4ms556 KiB
40Accepted67ms708 KiB
41Accepted56ms644 KiB
42Accepted2ms748 KiB
43Accepted3ms756 KiB
44Accepted3ms564 KiB
45Accepted3ms564 KiB
46Accepted2ms564 KiB
47Accepted2ms564 KiB
48Accepted4ms564 KiB
49Accepted4ms564 KiB
subtask622/22
50Accepted27ms972 KiB
51Accepted26ms1056 KiB
52Accepted27ms1076 KiB
53Accepted21ms1172 KiB
54Accepted13ms1124 KiB
55Accepted13ms1116 KiB
56Accepted1.19s1588 KiB
57Accepted833ms1632 KiB
58Accepted7ms564 KiB
59Accepted14ms892 KiB
60Accepted16ms860 KiB
61Accepted19ms820 KiB
62Accepted20ms1004 KiB
63Accepted13ms852 KiB
64Accepted68ms916 KiB
65Accepted68ms840 KiB
66Accepted196ms860 KiB