一道图论题。
变量解释:
B:连通块的编号;
g(B):B 连通块的点集;
bel(u):u 所在连通块编号;
写了一个 Dijkstra,传入 B 用 const int &
,B 就会改变。
值传递就不会。
void Dijkstra(const int &B){
while(!q.empty())q.pop();
printf("IN\n");
for(int i:g[B]){
q.push(make_pair(-dis[i],i));
printf("%d: %d\n",B,i);
}
while(!q.empty()){
int u=q.top().second;
q.pop();
if(vis[u])continue;
if(bel[u]!=B)
printf("%d %d-%d\n",u,bel[u],B);
vis[u]=1;
for(int i=head[u],v,w;i;i=e[i].nxt){
v=e[i].to,w=e[i].cost;
if(dis[v]>dis[u]+w){
dis[v]=dis[u]+w;
if(bel[v]==bel[u])
q.push(make_pair(-dis[v],v));
}
if(bel[v]!=B && --d[bel[v]]==0)
stk[++top]=bel[v];
}
}
printf("OUT\n");
}
Output:
IN
9: 13
9: 24
9: 21
9: 17
9: 37
9: 29
17 9-8
13 9-8
21 9-8
29 9-8
37 9-8
OUT
可以看到 B 从 9 变到 8。
是否 const int &B
存在情况会使 B 改变?