题意:

一个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. 手工sql注入简单入门

    1.判断是否可以注入: 数字型: 1.1在参数后面加一个引号',如果页面报数字number错误,则一定不是sql注入点:如果报数据库比如mysql.oracle之类的错误,则是一个sql注入点. 1. ...

  2. CF997C Sky Full of Stars 数论

    正解:容斥 解题报告: 传送门! 两个方法,分别港下QAQ 先说第一种 首先要推出式子,就∑2*C(i,n)*(-1)i+1*3i*3n*n-n+3*∑∑(-1)i+j+1*C(i,n)*C(j,n) ...

  3. 【PyQt5-Qt Designer】添加图片+鼠标点击

    添加图片+鼠标点击 graphicsView中添加图片 效果图 添加之后左边1处 生成qrc文件  选择文件右键编译-生成图片的16进制文件 课后作业:

  4. jenkins的pipeline的使用

    1.安装Pipeline Maven Integration Plugin 2.新建任务 3.编写pipeline代码 node { stage('get clone') { checkout([$c ...

  5. 火币网API文档——REST API 签名认证

    安全认证 目前关于apikey申请和修改,请在“账户 - API管理”页面进行相关操作.其中AccessKey为API 访问密钥,SecretKey为用户对请求进行签名的密钥(仅申请时可见).Pro站 ...

  6. ATM_购物车作业

    作业要求 模拟实现一个ATM + 购物商城程序 额度 15000或自定义 实现购物商城,买东西加入 购物车,调用信用卡接口结账 可以提现,手续费5% 支持多账户登录 支持账户间转账 记录每月日常消费流 ...

  7. 58A

    #include <stdio.h> #include <string.h> int main() { char hel[6]="hello"; char ...

  8. MacBook PyCharm永久激活

    今天下午突然提示到期不能用了,一阵慌慌... 1.下载补丁 注意下载后不需要移动补丁位置,下载文件名为:JetbrainsCrack-release-enc.jar 的文件 链接:https://pa ...

  9. JS取出两个数组中不重复的值

    var array = [0, 1, 2, 3, 4, 'age', 6, 7, 8, 9]; var array2 = [0, 1, 'age', 6, 7, 8, 9]; var arr3 = [ ...

  10. ElementNotVisibleException: Message: element not visible

    selenium自动化测试中,经常会报异常: 可能会有各种疑问,元素可以定位到啊.为什么报以下异常? ElementNotVisibleException: Message: element not ...