NOI 2015 DAY1 T1 程序自动分析 并查集+离散化
2015-07-19 16:02
417 查看
题意:暂且并没有链接
方法:并查集+离散化
解析:
国赛这道普及组难度的题我都不好意思写题解,
这道题的题意非常明了,一眼题..
其实就是把所有的要求sort一下,把令xi=xj的条件放在前面,令xi!=xj的条件放到后面就行了。
然后我们对于n个询问,先把所有的i,j离散化,这里我偷懒用了map
然后只需要将所有xi=xj的部分加到并查集里。
xi!=xj的部分看一下二者的祖先相不相同就行了,不相同就判断下一个,相同输出no;
代码:
这道题贴代码真是不好意思- -
#include <map> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define N 100100 using namespace std; int tot; int t; int n; int fa[N<<1]; map<int,int>m; struct node { int x,y,z; }a ; int find(int x) { if(fa[x]==x)return x; else fa[x]=find(fa[x]); return fa[x]; } int cmp(node a,node b){return a.z>b.z;} int main() { scanf("%d",&t); while(t--) { tot=0; m.clear(); scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].z); } for(int i=1;i<=n;i++) { if(!m[a[i].x])m[a[i].x]=++tot; if(!m[a[i].y])m[a[i].y]=++tot; } for(int i=1;i<=tot;i++)fa[i]=i; int flag=0; sort(a+1,a+n+1,cmp); for(int i=1;i<=n;i++) { int x=m[a[i].x],y=m[a[i].y]; int z=a[i].z; if(z==1) { int fx=find(x),fy=find(y); if(fx!=fy) { fa[fx]=fy; } }else { int fx=find(x),fy=find(y); if(fx==fy){printf("NO\n");flag=1;break;} } } if(!flag)printf("YES\n"); } }
相关文章推荐
- Java Swing编程接口(30)---列表框:JList
- realm simple
- realm tableview
- Objective C中数组排序几种情况的总结
- SQL脚本积累之三-----case....when...的使用示例
- 陈力:传智播客古代 珍宝币 泡泡龙游戏开发第九讲:块元素、行内元素、标准流、盒子模型
- 黑马程序员 About Me
- php实现网站顶踩功能的完整前端代码
- leetcode239:Sliding Window Maximum
- 欢迎使用CSDN-markdown编辑器
- 百度,360 你们谁是骗子?
- 编程中应注意的细节
- hdu 2141 Can you find it? 二分
- CAS
- Swap Nodes in Pairs
- 算法总结——spfa(使用优先队列的Bellman_Ford算法)
- Struts2乱码问题的解决办法
- Ubuntu输入密码登陆后又跳回到登录界面
- JavaScript--DOM修改元素的属性
- 黑马程序员——Java反射&动态代理