警示后人(prim30分)
查看原帖
警示后人(prim30分)
234497
Y_J_Y楼主2023/1/17 22:51

假如你的primprim算法和我一样并且在primprim外循环求出最长边,那么注意下面代码中的vis数组,因为双向边的存在之前的dis[u]dis[u]会被dis[v]dis[v]更新

调试了半天(哭

void prim(int S) {
	for(int i=1;i<=n;i++) dis[i]=int_INF;
	dis[S]=0;
	priority_queue<heapnode>q;
	q.push({S,0});
	while(!q.empty()&&cnt<=n-1) {
		heapnode f=q.top();q.pop();
		int u=f.u;
		if(vis[u]) continue;
		vis[u]=1;cnt++;
		for(int i=0;i<edge[u].size();i++) {
			int v=edge[u][i].v;
			if(vis[v]) continue;//注意这里
			if(dis[v]>edge[u][i].w) {
				dis[v]=edge[u][i].w;
				q.push({v,dis[v]});
			}
		}
	}
}
int main() {
	...
	for(int i=1;i<=n;i++) maxx=max(maxx,dis[i]);
	...
}
2023/1/17 22:51
加载中...