次小生成树的思想 pku1679最小生成树是否唯一

        次小生成树是权值第二小的生成树,可能与最小生成树权值相等。对于最小生成树上任意两点,如果只能经过最小生成树上的边,路径都是唯一的。而次小生成树可以由一条非最小生成树上的边换取一条最小生成树的边而得到。所以在生成最小生成树的同时,记录最小生成树上任意两点路径中最长的路径即可。

#include <iostream>
using namespace std ;

int graph[110][110], value[110][110] ; //value[i][j]表示最小生成树中i到j最长的路径							
int pre[110] ;                         //pre[i]表示i的前驱结点
bool visit[110] ;                      //标志结点是否被访问
int n, m, t, i, j, k, sum, Min, a, b ;
void Prim()
{
	sum=0 ;
	visit[1]=true ;
	for(i=1; i<n; i++)
	{
		j=1 ;
		while(visit[j])  j++ ;
		for(Min=j++; j<=n; j++)
			if(!visit[j]&&graph[Min][0]>graph[j][0])
			   Min=j ;
		sum+=graph[Min][0] ;

		for(j=1; j<=n; j++)
			if(visit[j])//保存j与Min间最长的边权值
			{
			  if(value[j][pre[Min]]<graph[Min][0])	
			  {
				 value[j][Min]=graph[Min][0];
				 value[Min][j]=value[j][Min] ;
			  }
			  else
              {
				 value[j][Min]=value[j][pre[Min]];
				 value[Min][j]=value[j][Min] ;
			  }
			}
		visit[Min]=true ;
		
		for(j=1; j<=n; j++)
			if(!visit[j]&&graph[j][Min]<graph[j][0])
			{
				graph[j][0]=graph[j][Min] ;
				pre[j]=Min ;
			}	
	}
}

void SecondMST()
{
	a=INT_MAX ;
	for(i=1; i<=n; i++)
	  for(j=1; j<=n; j++)
		if(i!=j && pre[i]!=j && pre[j]!=i)
		    if(a>sum-value[i][j]+graph[i][j]&&graph[i][j]<INT_MAX)
				a=sum-value[i][j]+graph[i][j];	 
}
int main()
{
	scanf("%d", &t) ;
	while(t--)
	{
		scanf("%d%d", &n, &m) ;
		for(i=0; i<=n; i++)
			for(j=0; j<=n; j++)
				graph[i][j]=INT_MAX, value[i][j]=0 ;
		for(i=0; i<m; i++)
		{
			scanf("%d%d%d",&a,&b, &j) ;
			graph[a][b]=graph[b][a]=j ;
		}
		for(i=1; i<=n; i++)
			visit[i]=false, pre[i]=1, graph[i][0]=graph[i][1] ;
		Prim() ;
		SecondMST() ;
		if(a==sum)  printf("Not Unique!\n");
		else        printf("%d\n",sum) ;
	}
		return 0 ;
}


 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值