53962023-05-09 14:12:52mraronAutópálya inflációcpp17Elfogadva 100/1001.291s7484 KiB
#include<vector>
#include<iostream>
#include<algorithm>
#include<queue>
#include<cassert>
#include<array>
using namespace std;
using ll = long long;
#define xx first
#define yy second

const int MAXN=3001;
const int mod=1e9+7;

int n,m;
vector<pair<int,int>> adj[MAXN];
vector<array<int, 4>> par[MAXN];

int get_len(int x, int y) {
    int res=0;
    while(x!=par[x][y][0]) {
        array<int, 4> p=par[x][y];
        x=p[0];
        y=p[1];
        res++;
    }
    return res;
}

ll compare(int a, int b, int w1, int l1,  int x, int y, int w2, int l2) {
    ll bal=0;
    int i=l1, j=l2;
    while(i>0 || j>0) {
        array<int, 4> p1=par[a][b],
                      p2=par[x][y];
        if(i>j) {
            bal=(bal-w1)*2-p1[2];
            w1=0;
            a=p1[0];
            b=p1[1];
            i--;
        }else if(i<j) {
            bal=(bal+w2)*2+p2[2];
            w2=0;
            x=p2[0];
            y=p2[1];
            j--;
        }else {
            bal=(bal-w1+w2)*2-p1[2]+p2[2];
            w1=w2=0;
            a=p1[0];
            b=p1[1];
            x=p2[0];
            y=p2[1];
            i--;j--;
        }

        if(abs(bal)>(ll)2e9) {
            return bal;
        }
    }
    bal-=w1;bal+=w2;
    return bal;
}

int get_ans(int x, int y) {
    int res=0;
    while(x!=par[x][y][0]) {
        array<int, 4> p=par[x][y];
        res=(res*2%mod+p[2])%mod;
        x=p[0];
        y=p[1];
    }

    return res;
}

struct state {
    int x;
    int pa, pb, pw;
    int len;

    bool operator<(const state& masik) const {
        ll b=compare(pa, pb, pw, len, masik.pa, masik.pb, masik.pw, masik.len);
        if(b>0) return true;
        if(b<0) return false;
        return len<masik.len;
    }
    bool operator>(const state& masik) const {
        return !(*this<masik);
    }
};

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cin>>n>>m;
    for(int i=0;i<m;++i) {
        int a,b,c;
        cin>>a>>b>>c;
        adj[a].push_back({b,c});
        adj[b].push_back({a,c});
    }

    vector<int> ans(n+1, -1);
    priority_queue<state, vector<state>, greater<state>> pq;
    pq.push(state{1, 1, 0, 0, 0});
    while(!pq.empty()) {
        state curr=pq.top();
        pq.pop();
        //cerr<<curr.x<<" "<<curr.pa<<" "<<curr.pb<<" "<<curr.pw<<"\n";
        int x=curr.x;
        if(!par[x].empty() && par[x].back()[3]<=curr.len) continue ;
        
        par[x].push_back({curr.pa, curr.pb, curr.pw, curr.len});
        if(par[x].size()==1) {
            ans[x]=get_ans(x, 0);
        }
        
        for(auto i:adj[x]) {
            pq.push(state{i.xx, x, (int)par[x].size()-1, i.yy, curr.len+1});
        }
    }
    int sum=0;
    for(int i=2;i<=n;++i) {
        sum+=par[i].size();
        cout<<ans[i]<<"\n";
    }
    cerr<<double(sum)/n<<"\n";
}
RészfeladatÖsszpontTesztVerdiktIdőMemória
subtask10/0
1Elfogadva3ms2028 KiB
2Elfogadva26ms3192 KiB
subtask28/8
3Elfogadva9ms3036 KiB
4Elfogadva19ms2984 KiB
5Elfogadva12ms3108 KiB
6Elfogadva8ms3500 KiB
7Elfogadva52ms3504 KiB
subtask315/15
8Elfogadva3ms3388 KiB
9Elfogadva3ms3712 KiB
10Elfogadva3ms3672 KiB
11Elfogadva3ms3664 KiB
12Elfogadva3ms3672 KiB
13Elfogadva3ms4008 KiB
14Elfogadva3ms4148 KiB
15Elfogadva3ms4096 KiB
16Elfogadva3ms4356 KiB
17Elfogadva3ms4440 KiB
18Elfogadva3ms4384 KiB
subtask434/34
19Elfogadva16ms5204 KiB
20Elfogadva50ms5140 KiB
21Elfogadva57ms5320 KiB
22Elfogadva30ms5240 KiB
23Elfogadva29ms5284 KiB
24Elfogadva107ms4956 KiB
25Elfogadva12ms5512 KiB
26Elfogadva9ms5912 KiB
27Elfogadva98ms5236 KiB
28Elfogadva21ms5176 KiB
29Elfogadva26ms5200 KiB
30Elfogadva64ms5164 KiB
31Elfogadva54ms5300 KiB
32Elfogadva173ms5380 KiB
33Elfogadva177ms5576 KiB
subtask521/21
34Elfogadva4ms5060 KiB
35Elfogadva8ms5196 KiB
36Elfogadva7ms5388 KiB
37Elfogadva7ms5520 KiB
38Elfogadva6ms5492 KiB
39Elfogadva6ms5272 KiB
40Elfogadva70ms5144 KiB
41Elfogadva59ms5088 KiB
42Elfogadva4ms4908 KiB
43Elfogadva4ms4848 KiB
44Elfogadva4ms5144 KiB
45Elfogadva4ms5188 KiB
46Elfogadva4ms5060 KiB
47Elfogadva4ms5104 KiB
48Elfogadva4ms5076 KiB
49Elfogadva4ms5100 KiB
subtask622/22
50Elfogadva27ms5572 KiB
51Elfogadva25ms5796 KiB
52Elfogadva26ms6196 KiB
53Elfogadva21ms6120 KiB
54Elfogadva13ms6228 KiB
55Elfogadva13ms6360 KiB
56Elfogadva1.291s7484 KiB
57Elfogadva836ms7436 KiB
58Elfogadva8ms5628 KiB
59Elfogadva14ms5788 KiB
60Elfogadva17ms5784 KiB
61Elfogadva20ms5704 KiB
62Elfogadva20ms5692 KiB
63Elfogadva14ms5812 KiB
64Elfogadva71ms5764 KiB
65Elfogadva71ms5768 KiB
66Elfogadva223ms5780 KiB