题意:给出一个带权无向图 , 假设存在这样一个子图:子图中至少两个点 , 并且连通 , 子图中的最小边权 ,要比边界边的最大值大(边界边是指 , 一个点在子图中 , 另一个点不在子图中) , 问 ,所有这样子图的顶点数总和是多少?

解法:kruskal的思想,先将边权大的连接,然后判断是否满足  ,  依次连接即可!
我们先考虑用kruskal算法求最大生成树的过程 , 假如我们要加入一条新边 ,如果这条新边上的点和以前已经加入的一些点是可到达的(在这个还未形成的最大生成树上) , 如果这样子图存在 ,那么这个子图肯定包括所有以前加入并且和当前加入点相连(可到达)的点。

代码:

#include
#include
#include
#include
#include
using namespace std;

#define MAXN 5010
#define INF 0x3f3f3f3f
#define min(x , y)  (x)<(y)?(x):(y)
struct node
{
      int x ,y;
      int w;
}edge[MAXN*2505];

struct node1
{
      int x;
      int w;
}e;

int p[MAXN];
vectorgrap[MAXN];
int n , m , minx , maxx;
int fa;
int num[MAXN];

bool cmp(node x , node y)
{
      return x.w<= y.w;
}

void init()
{
      for(int i =0; i <= n; i++)
      {
            p[i] = i;
            grap[i].clear();
      }

}

int find(int x)
{
      int g = x ,h;
      while(x !=p[x])  x = p[x];

while(p[g]!= x)
      {
            h =p[g];
            p[g] =x;
            g = h;
      }

returnx;
}

bool check(int fa)
{
      int i ,j;
      int minx =INF , maxx = 0;
      int x;
      for(i = 1; i<= n; i++)
      {
            x =find(i);
            if(x !=fa)  continue;
            for(j = 0; j< grap[i].size(); j++)
            {
                  x =find(grap[i][j].x);
                  if(x ==fa)
                  {
                        if(grap[i][j].w < minx)  minx =grap[i][j].w;
                  }
                  else  if(grap[i][j].w >maxx)  maxx = grap[i][j].w;
            }
      }

if(maxx< minx)  return true;
      else returnfalse;
}

int kruskal()
{
      sort(edge ,edge+m , cmp); //对边进行排序

int i , x ,y , k = 0;

for(i = 1; i<= n; i++)    p[i]= i;
      for(i = 1; i<= n; i++)    num[i] = 1;
     
      int sum =0;

for(i = m-1;i >= 0; i--)
      {
            x =find(edge[i].x); // 判断这两个点是不是在同一颗树上
            y =find(edge[i].y);

if(x !=y)
            {
                  if(k ==(n-2))  break;
                  p[x] =y;
                  num[y] +=num[x];
                 
                  if(check(y))  sum += num[y];
                  k +=1;

}
      }

returnsum+n;

}

int main()
{
      int t;
      cin>>t;
      while(t--)
      {
            int i;
            scanf("%d%d" , &n , &m) ;
            init();
           
            for(i = 0; i< m; i++)
            {
                  scanf("%d %d%d" , &edge[i].x , &edge[i].y ,&edge[i].w);
                  e.x =edge[i].y , e.w = edge[i].w;
                  grap[edge[i].x].push_back(e);
                  e.x =edge[i].x;
                  grap[edge[i].y].push_back(e);
            }
           
            i =kruskal();
            cout<<i<<endl;
           
           
      }
      return0;
}

uva 1265 (LA 4848)相关推荐

  1. UVA 413|LA 5388|POJ 1492|ZOJ 1338 Up and Down Sequences

    https://zoj.pintia.cn/problem-sets/91827364500/problems/91827364837 题意:如果是上升序列,上升序列的长度不是所有上升数字的,是这么规 ...

  2. UVa在线比赛单题汇总-----DP专题

    动态规划基础 例题 LA 3882 UVa 3882 - And Then There Was One 递推------------无力orz UVa 10635 10635 - Prince and ...

  3. 刘汝佳训练指南《网络流》专题 BY 9974

    最近一直在做白书上的网络流, 做得几乎差不多了,在这小小总结一下. 已经忽略很水的题.差不多按难度排序了. UVa 11248                   增广小优化. UVa 1306(LA ...

  4. UVa LA 4253 UVa 1421 Archery 枚举,状态削减,oj错误题目 难度: 1

    题目 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&a ...

  5. UVa LA 3882 - And Then There Was One 递推,动态规划 难度: 2

    题目 https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_pr ...

  6. 判断条件UVa 10192 - Vacation(LCS水题)

    PS:今天上午,非常郁闷,有很多简单基础的问题搞得我有些迷茫,哎,代码几天不写就忘.目前又不当COO,还是得用心记代码哦! 题目:http://uva.onlinejudge.org/index.ph ...

  7. [搜索]UVa 129 困难的串

    题意:将一个包含两个相邻的重复子串的子串,称为"容易的串",其他为"困难的串". 输入正整数n和l,输出由前l个字符组成的,字典序第n小的困难的串. 输入样例: ...

  8. uva 401.Palindromes

    题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...

  9. Uva 3767 Dynamic len(set(a[L:R])) 树套树

    Dynamic len(set(a[L:R])) Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 https://uva.onlinejudge.org/in ...

最新文章

  1. find_in_set
  2. 刷爆了!这项技术BAT力捧!程序员:我彻底慌了...
  3. html复选框位置,html – 对齐复选框和标签
  4. java 两个等长数组的中位数_查询两个数组的中位数
  5. ggplot2设置坐标轴范围_Matplotlib入门-2-坐标轴axis/axes设置
  6. 如何将一个文件分割成多个小文件
  7. 3012C语言_数据
  8. 工业交换机如何预防雷电?
  9. mysql添加字符串日期时间_mysql学习笔记--- 字符串函数、日期时间函数
  10. HP-UX 11i v2安装使用python 2.5.2
  11. ubuntu安装 opencv-3.4.3
  12. 最新弱口令字典,常用密码,弱密码集合
  13. 使用Layered分层窗口实现视频会议中的桌面区域共享
  14. 怎样对php手册解除锁定,word锁定怎么解锁
  15. python bs期权模型_使用python第二部分建立股票期权评估模型
  16. yigo基础学习笔记3_数据迁移
  17. “数据”企业之命脉,守护有责。
  18. tomcat 设置缓存大小
  19. 怎么拍照识别植物的名称呢?教大家一个识别小妙招
  20. 浅谈精益数字化工厂(Lean Digital Factory, LDF)

热门文章

  1. js replace方法
  2. 大数据技术——从海量数据的存储到海量数据的计算
  3. 不要在该约炮的年龄谈修行------杨绛与你我无关(写得太他妈好了)
  4. 「第一部:容器和Docker」(2) 什么是Docker
  5. 【首尔大学韩国语】十四课 快走吧
  6. 超越同龄人的MySQL意识
  7. 等保测评--通信网络安全测评要求
  8. 使用苹果企业证书签名的绿色游戏应用有以下几个优势:
  9. CodeForces - 1305 C. Kuroni and Impossible Calculat(鸽巢原理)
  10. 学生成绩档案管理系统(预习)