为什么不能用prim
查看原帖
为什么不能用prim
1190741
Violet_Evergardon楼主2024/8/20 16:40

记录下每个点的深度,在计算路径权值时更新。

那在确定根节点的情况下,每一条边都会在深度小的时候和深度大的时候都计算。

#include<bits/stdc++.h>
using namespace std;
const int M=1e3+5;
int ans,n,m,minn=1e9,lj[100],dis[100],inf;
bool vis[100];
long long head[M],nxt[M],to[M],w[M],cnt=0;
void jb(int a,int b,int c){
	nxt[++cnt]=head[a];
	head[a]=cnt;
	to[cnt]=b;
	w[cnt]=c;
}
void prim(int x){
	ans=0;
	memset(vis,0,sizeof(vis));
	memset(lj,0,sizeof(lj));
	memset(dis,127,sizeof(dis));
	inf=dis[0];
	dis[x]=0;lj[x]=1;
	int m,k;
	for(int l=1;l<=n;l++){
		m=inf;
		for(int j=1;j<=n;j++)
			if(lj[j]!=0&&(lj[j]-1)*dis[j]<m&&!vis[j])	m=dis[j],k=j;
		vis[k]=1;
		ans+=dis[k]*(lj[k]-1);
		for(int i=head[k];i;i=nxt[i]){
			int v=to[i];
			if(dis[v]>lj[k]*w[i]){
				if(lj[v]!=0) lj[v]=min(lj[v],lj[k]+1);
				else lj[v]=lj[k]+1;
				dis[v]=lj[k]*w[i];
			}
		}
	}
	minn=min(minn,ans);
}
int main(){
//	freopen("treasure.in","r",stdin);
//	freopen("treasure.out","w",stdout);
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		int a,b,c;
		cin>>a>>b>>c;
		jb(a,b,c);
		jb(b,a,c);
	}
	for(int i=1;i<=n;i++){
		prim(i);
	}
	cout<<minn<<endl;
	return 0;
}

2024/8/20 16:40
加载中...