蓝桥杯 国王的烦恼 反向并查集
2016-03-17 18:45
381 查看
这题刚开始用搜索做的,超时不超时不知道,因为测试数据都没过,然后看到别人用的反向并查集,秒懂,
因为起初我也是想的用并查集,但是想的是正向并查集,没有想到反向并查集。
因为起初我也是想的用并查集,但是想的是正向并查集,没有想到反向并查集。
#include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<cctype> #include<cmath> #include<algorithm> #include<string> #include<map> #include<queue> #include<stack> #include<set> #include<vector> using namespace std; const int maxn=1e4+10; const double eps=1e-6; struct node { int a1,a2,t; }bridge[100010]; int n,m; int f[maxn]; int cmp(node x,node y) { return x.t>y.t; } int find(int x) { return f[x]==x?x:f[x]=find(f[x]); } int main() { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) f[i]=i; int day=0; for(int i=0;i<m;i++) { scanf("%d%d%d",&bridge[i].a1,&bridge[i].a2,&bridge[i].t); if(bridge[i].t>day) day=bridge[i].t; } sort(bridge,bridge+m,cmp); int sum=0; int i=0; while(day>0) { while(bridge[i].t==day) { int u=find(bridge[i].a1),v=find(bridge[i].a2); if(u!=v) { f[u]=v; sum++; break; } else i++; } while(bridge[i].t==day) { int u=find(bridge[i].a1),v=find(bridge[i].a2); f[u]=v; i++; } day--; } cout<<sum<<endl; return 0; }
相关文章推荐
- 二叉查找树模版
- 复利计算3.0 心得
- python 根据现有文件树创建文件树
- vmware.c:1226: error: ‘XML_PARSE_HUGE’ undeclared (first use in this function)
- 人如流水
- STL(map和二维map/hdu1263)
- L3-函数传参、for循环的使用
- HDU 3068 最长回文
- try——catch——finally使用return的顺序
- golang中发送http请求的几种常见情况
- distinct和group by
- Codeforces 4C Registration system (map)
- android:showAsAction="never"报错
- day06
- GO备忘录
- Linux Shell脚本编程--curl命令详解
- Python的yield用法
- bzoj 1835 [ZJOI2010]base 基站选址(DP+线段树)
- iTunes Connect接入GameCenter配置
- Numpy读书笔记