主なアイデア:ダイクストラ+ 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)を増加し続けるノック!