2.16日学习总结

今天是做最小生成树的题解。是两个并非模板格式的。但是运用了最小生成树知识的题目。

题目如图所示。

2.16日学习总结_第1张图片

题目中给出的条件是要求形成k个树 但是一个树最低可以 为一。然后我们就可以。将它转化为求一颗节点数为n减去k减去1,这样的话就可以解决这个题目。具体代码如下,

    #include
  #include 
   using namespace std;
   int f[1000000];
   struct node{
   	int x,y,t;
  	 }b[1000000];
   bool operator <(node a,node b){
   	return a.t

因为一题的题目就是

2.16日学习总结_第2张图片

 这道题就是将最小生成数改成了最大生成树,只要将排序的部分改成从大到小就行了。具体代码如下,

  #include
 #include 
  using namespace std;
  int f[1000000];
  struct node{
  	int x,y,t;
 	 }b[1000000];
  bool operator <(node a,node b){
  	return a.t>b.t;}
   int find(int x) 
   {
   	if(f[x]==x){
            
        
   	return x;}
   	else {
   	  f[x]=find(f[x]);
   	  return f[x];} 
       
   }
  int n,m,num,ans,k;
  int main()
  {
  	scanf("%d%d%d",&n,&m,&k);
  	for(int i=1;i<=n;i++){
 	 	f[i]=i;}
  	for(int i=1;i<=m;i++)
  		scanf("%d%d%d",&b[i].x,&b[i].y,&b[i].t);
  	sort(b+1,b+1+m);
  	for(int i=1;i<=m;i++)
  	{
  	int x=find(b[i].x),y=find(b[i].y);
  	if(x!=y) {
 	f[x]=y;
 	num++;
 	ans+=b[i].t;}
 	if(num==k){
	 printf("%d\n",ans);
	 break;	
	 }
  	}
   return 0;
  }
  

今天的学习总结就到这里了。

你可能感兴趣的:(学习,蓝桥杯,职场和发展)