前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >蓝桥杯历届试题 国王的烦恼(并查集+快排)------C语言—菜鸟级

蓝桥杯历届试题 国王的烦恼(并查集+快排)------C语言—菜鸟级

作者头像
Fivecc
发布2022-11-21 14:49:24
2640
发布2022-11-21 14:49:24
举报
文章被收录于专栏:前端ACE

解题思路:采用并查集的思想,逆向的将树建一遍,所以这里我需要对天数排序, 从大到小进行排序。接着进行建树,在建树的过程中不断地进行判断,我之前是否有 这个桥,如果没有那么就抗议次数++。这里还有一个需要注意的就是:前一次是在 第几天抗议的,如果是同一天的话就不要++了,所以这里要特殊判断一下。

详见代码。

代码语言:javascript
复制
`#include<stdio.h> 
long int f[10002];
struct node
{ long int a,b,t;
} s[100003];
void init(long int n)//初始化 
{ long int i;
  for(i=1;i<=n;i++)
    f[i]=i;
}
long int ftop(long int x)//寻根节点 
{   long int t,tx=x;
   while(tx!=f[tx])tx=f[tx];
   while(x!=tx)
   {   t=f[x];
       f[x]=tx;
       x=t;
   }
   return tx;
}
int find(long int x,long int y)
{  
      x=ftop(x);
      y=ftop(y);
      if(y!=x)//判断是否在同一集合 
      { f[y]=x;
       return 1; 
      }
      return 0;
}
 void swp(long int x,long int y)//快排 
 { struct node te=s[x];s[x]=s[y];s[y]=te;}
    
    long  int kp(long int ks,long int js)
    {    long int x=s[ks].t;
       long int i=ks,j=js+1;
       while(1)
       {  while(s[++i].t<x&&i<js);
          while(s[--j].t>x);
          if(i<j)swp(i,j);
          else break;
       }
       swp(ks,j);
       return j;
    }
 void ppp(long int ks,long int js)
 { long int r;
     if(ks<js)
     {  r=kp(ks,js);
        ppp(ks,r-1);
        ppp(r+1,js);
     }
 }
int main()
{
 long int n,m,i,j,sum=0,pre=-1;
 scanf("%ld%ld",&n,&m);
 init(n);
for(i=1;i<=m;i++)
scanf("%ld%ld%ld",&s[i].a,&s[i].b,&s[i].t);
ppp(1,m);//快排 
 for(i=m;i>=1;i--)
if(find(s[i].a,s[i].b)&&s[i].t!=pre)sum++,pre=s[i].t;
 printf("%ld\n",sum);
return 0;
}`
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-04-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档