非严格次小生成树求条
  • 板块灌水区
  • 楼主yingshi1119
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/10/17 20:33
  • 上次更新2024/10/17 22:15:52
查看原帖
非严格次小生成树求条
818730
yingshi1119楼主2024/10/17 20:33

rt

#include <bits/stdc++.h>
using namespace std;
const long long inf=1e18;
const int N=1e3+10;
long long G[N][N];
long long f[N][N];
bool vis[N][N];
int pre[N];
long long dis[N];
bool v[N];
long long fulldis;
int main()
{
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
  		for(int j=1;j<=n;j++)
		{
	   		if(i==j) G[i][j]=0;
	  		else G[i][j]=inf;
  		}
 	}
 	for(int i=1;i<=m;i++)
	{
 		int u,v,w;
		cin>>u>>v>>w;
  		G[u][v]=G[v][u]=w;
 	}
 	for(int i=1;i<=n;i++) 
	{
  		dis[i]=G[1][i];
  		pre[i]=1;
 	}
 	v[1]=1;
 	pre[1]=0;
 	for(int j=1;j<=n-1;j++)
	{
  		long long minn=inf,x;
  		for(int i=1;i<=n;i++)
		{
   			if(v[i]==0&&dis[i]<minn)
			{
    			minn=dis[i];
    			x=i;
   			}
  		}
	  	v[x]=1;
	  	fulldis+=dis[x];
	  	vis[x][pre[x]]=vis[pre[x]][x]=1;
	  	for(int i=1;i<=n;i++)
		{
	   		if(v[i])
			{
	    		f[x][i]=f[i][x]=max(dis[x],f[i][pre[x]]);
	   		}
	   		if(v[i]==0&&G[x][i]<dis[i])
			{
	    		dis[i]=G[x][i];
	    		pre[i]=x;
	   		}
	  	}
 	}
	cout<<fulldis<<" ";
	long long ans=inf;
	for(int i=1;i<=n;i++)
	{
	  	for(int j=i+1;j<=n;j++)
		{
	   		if(vis[i][j]==0&&G[i][j]!=inf)
			{
	    		ans=min(ans,fulldis+G[i][j]-f[i][j]);
	   		}
	  	}
	}
	cout<<ans;
    return 0;
}```

玄关
2024/10/17 20:33
加载中...