NOI 2015 DAY1 T1 程序自动分析 并查集+离散化

来源:互联网 发布:linux批量移动文件夹 编辑:程序博客网 时间:2024/04/25 12:27

题意:暂且并没有链接

方法:并查集+离散化

解析:

国赛这道普及组难度的题我都不好意思写题解,

这道题的题意非常明了,一眼题..

其实就是把所有的要求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[N];  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");      }  }  
0 0
原创粉丝点击