[説明] PAT 1003緊急

主なアイデア:ダイクストラ+ DP

最も短絡回数を行っている場合、この質問は、二重の経験と同等です。

除く、ダイクストラを実行する場合には、ある\(T_Iを\)第として\(I \) ショートバーの最小数は場合ポイント\(rs_i \)第として\(I \)は最短点を指し最大値と右

分類される、メンテナンスの回数がないことに注意してください\(DIS \)のアップデート、新しい値で上書きする前に更新された値。

また、ポイント数\(0 \) \(\ 1-N-) エッジがある双方向エッジが、間違いなく

コードの一部:


struct wtf{ 
    int t,r,rs;
}r[505];

struct node{
    int u,d;
    friend bool operator<(const node &a,const node &b){
        return a.d>b.d;
    }
};

void Dijkstra(){
    for(int i=0;i<=n-1;i++) dis[i]=inf;
    dis[c1]=0, r[c1].t = 1;
    priority_queue<node>q;
    node x;
    x.u=c1,x.d=0;
    q.push(x);
    while(!q.empty()) {
        node fr = q.top();
        q.pop();
        int u = fr.u, d = fr.d;
        if(d != dis[u]) continue;
        for(int i = head[u]; i != -1; i = e[i].next) {
            int v = e[i].to, w = e[i].w;
            if(dis[u] + w <= dis[v]) {
                bool flag = 0;
                if(dis[u] + w < dis[v])
                    r[v].t = r[u].t,
                    flag = 1;
                else if(dis[u] + w == dis[v])
                    r[v].t = r[v].t + r[u].t;
                    
                r[v].rs = max(r[u].rs + r[v].r, r[v].rs);
                dis[v] = dis[u] + w;
                if(flag) {
                    node y;
                    y.u = v, y.d = dis[v];
                    q.push(y);
                }
            }
        }
    }
}

PS:ヘルプの人が見て、彼らは、コードのタイトルを変更した場合、3年最初のコード,,,中学校は(TUI)油(FEI)を増加し続けるノック!

おすすめ

転載: www.cnblogs.com/yizimi/p/12014384.html