题意:

一个KTO被定义为一个特殊的连通块,这个连通块满足一个要求,这个连通块中的最短的边大于 与这个连通相连的不属于这个连通块的边中的最大值。

给出一个图,统计KTO里面的点有多少个。(一个点可以属于多个KTO)

如a中有3个KTO,b中有6个KTO。

思路:

因为题目中给出的n最大为5000,那么相应的边为25000000,数量太大,所以一直卡在如何O(log(m))的计算连通块的数量。

但是看了题解之后,大家都是暴力的,那么以后有暴力思路就写(T)一发暴力好了。

首先把边从大到小排序,对于每一条边的两个点,如果已经在同一个连通块中,那么就不管了,因为已经统计过这个连通块了;

若不在同一个连通块中,则合并这个两个连通块,然后判断是否满足条件,若满足条件,那么就加上合并后连通块中的总共有的点数。

重点就是如何判断满足条件以及统计连通块中的点的个数

首先,这个条件是指连通块中的最小的边必须大于与连通块相连的但不属于连通块的最大的边,当前枚举到的边,一定大于或者等于与连通块相连的但不属于连通块的最大的边,因为边是按照从大到小排序的,所以更大的边已经合并到连通块中;但是当前枚举的边却不一定是连通块中的最小的边,因为可能后面更小的边的两个点都在当前的连通块中,写题的时候就是在这里WA的。

解决办法当然就是暴力从当前边开始枚举,往后找在连通块中的最小的边,以及不在连通块当中的最大的边,比较两者的值即可。

第二个问题是统计连通块中的点的数量。感谢MZjj点拨本弱带权并查集,因为是启发式合并,所以就像按秩合并那样开一个数组记录一下size就可以了,脑子太迟钝Orz。

代码:

 #include <stdio.h>
#include <string.h>
#include <algorithm>
#include <vector>
#include <iostream>
using namespace std; const int N = ;
const int inf = 0x3f3f3f3f; struct edge
{
int x,y;
int c; edge(int aa,int bb,int cc)
{
x = aa;
y = bb;
c = cc;
}
}; vector<edge> es;
int par[N],sz[N]; void init(int n)
{
es.clear(); for (int i = ;i <= n;i++)
{
par[i] = i;
sz[i] = ;
}
} bool cmp(edge ea,edge eb)
{
return ea.c > eb.c;
} int fin(int x)
{
if (x == par[x]) return x;
else return par[x] = fin(par[x]);
} void unit(int x,int y)
{
x = fin(x);
y = fin(y); if (x == y) return; par[x] = y;
sz[y] += sz[x];
} int main()
{
int t; scanf("%d",&t); while (t--)
{
int n,m; scanf("%d%d",&n,&m); init(n); for (int i = ;i < m;i++)
{
int a,b,c; scanf("%d%d%d",&a,&b,&c); es.push_back(edge(a,b,c));
} sort(es.begin(),es.end(),cmp); long long ans = ; for (int i = ;i < es.size();i++)
{
int x = es[i].x,y = es[i].y; if (fin(x) == fin(y)) continue; unit(x,y); int maxn = -inf,minn = inf; for (int j = i;j < es.size();j++)
{
int p = es[j].x,q = es[j].y; if (fin(p) == fin(q) && fin(p) == fin(x))
{
minn = min(minn,es[j].c);
}
else if (fin(p) == fin(x) || fin(q) == fin(x))
{
if (fin(p) != fin(q))
{
maxn = max(maxn,es[j].c);
}
}
} if (minn > maxn)
ans += sz[fin(x)]; //if (sz[fin(x)] == 6) printf("%d %d **\n",maxn,minn);
} cout << ans << endl;
} return ;
}

uvalive 4848 Tour Belt的更多相关文章

  1. UVA1265 Tour Belt Kruskal重构树、倍增、树上差分

    题目传送门 题意:定义$Tour \, Belt$为某张图上的一个满足以下条件的点集:①点集中至少有$2$个点②任意两点互相连通③图上两个端点都在这个点集中的边的权值的最小值严格大于图上只有一个端点在 ...

  2. UVaLive 6853 Concert Tour (DP)

    题意:给定 n 个城市,m 个月,表示要在这 n 个城市连续 m 个月开演唱会,然后给定每个月在每个城市开演唱会能获得的利润,然后就是演唱会在不同城市之间调动所要的费用, 问你,怎么安排这 n 个演唱 ...

  3. POJ 1637 Sightseeing tour

    Sightseeing tour Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 9276   Accepted: 3924 ...

  4. Euler Tour Tree与dynamic connectivity

    Euler Tour Tree最大的优点就是可以方便的维护子树信息,这点LCT是做不到的.为什么要维护子树信息呢..?我们可以用来做fully dynamic connectivity(online) ...

  5. POJ2677 Tour[DP 状态规定]

    Tour Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4307   Accepted: 1894 Description ...

  6. UVALive - 4108 SKYLINE[线段树]

    UVALive - 4108 SKYLINE Time Limit: 3000MS     64bit IO Format: %lld & %llu Submit Status uDebug ...

  7. UVALive - 3942 Remember the Word[树状数组]

    UVALive - 3942 Remember the Word A potentiometer, or potmeter for short, is an electronic device wit ...

  8. UVALive - 3942 Remember the Word[Trie DP]

    UVALive - 3942 Remember the Word Neal is very curious about combinatorial problems, and now here com ...

  9. soj 1015 Jill's Tour Paths 解题报告

    题目描述: 1015. Jill's Tour Paths Constraints Time Limit: 1 secs, Memory Limit: 32 MB Description Every ...

随机推荐

  1. 《HTTP - http报文》

    还时推荐一首歌 - 那吾克热<纸飞机> 有没有突然想要个孩子的冲动,哈哈. 读 第三章<HTTP报文内的HTTP信息> 总结 1:用于HTTP协议交互叫做HTTP报文,请求端( ...

  2. jquery图片懒加载效果

    1.要引入jquery 2.要引入underscore.js <!DOCTYPE html> <html lang="en"> <head> & ...

  3. es中的停用词

    停用词主要是为了提升性能与精度.从早期的信息检索到如今,我们已习惯于磁盘空间和内存被限制为很小一部分,所以 必须使你的索引尽可能小. 每个字节都意味着巨大的性能提升. 词干提取的重要性不仅是因为它让搜 ...

  4. jquery实现简单的弹出框

    弹出框本身是一个div,默认是隐藏不展示的,在需要弹框的时候使其显示,并浮在当前页面之上 弹框样式: .tanchuang { width: 100%; height: 100%; display: ...

  5. Wordpress安装Redis为网站加速

    前面我们讲了宝塔Linux面板安装Redis,现在我们来举一些例子来看看redis的实际运用,比如Wordpress安装Redis为网站加速,下面就跟着ytkah一起来操作一下. 第一,下载predi ...

  6. 20180322 对DataTable里面的数据进行去重

    对DataTable里面的数据进行去重 DataTable dt = new DataTable(); dt.Columns.Add("Id", typeof(int)); dt. ...

  7. resful规范

    1.简介 什么是resful resful是一个规范,说白了就是面向资源编程,把网络中所有的东西,想象成资源 2.规范 10条规范 1)API与用户的通信协议,总是用HTTPS协议:HTTPS比htt ...

  8. 在Java应用中通过SparkLauncher启动Spark任务

    本博客内容基于Spark2.2版本,在阅读文章并想实际操作前,请确保你有: 一台配置好Spark和yarn的服务器 支持正常spark-submit --master yarn xxxx的任务提交 老 ...

  9. Java知识点ArrayList

    ArrayList List<ApiSvcVersion> apiSvcVersionList = apiSvcVersionDao.getListByClientId(map1); // ...

  10. Python 全栈开发一 python初识

    1.Python简介 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC ...