bzoj4195(并查集+离散化)
生活随笔
收集整理的這篇文章主要介紹了
bzoj4195(并查集+离散化)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目大意:給出n個變量互相的相等或不等關系,求這些關系是否矛盾
思路:把相等的變量加入并查集,不等的查詢是否合法
eg:數據很大,離散化(然而我用的是map)
#include<stdio.h> #include<algorithm> #include<string.h> #include<map> using namespace std; int fa[10000000],n,sum[10000000],tot,T; map<int,int> old,tong; struct node {int x,y,c; }a[10000000]; template<class T>void read(T &x) {x=0;char ch=getchar();while(ch<'0'||ch>'9') ch=getchar();while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();} } int find(int x) {int p=x,q;while(x!=fa[x])x=fa[x];while(p!=x){q=fa[p];fa[p]=x;p=q;}return x; } int main() {read(T);while(T--){old.clear();tong.clear();tot=0;bool flag=0;read(n);for(int i=1;i<=n;i++){read(a[i].x);read(a[i].y);read(a[i].c);if(tong[a[i].x]==0){ tong[a[i].x]=1;sum[++tot]=a[i].x;}if(tong[a[i].y]==0){tong[a[i].y]=1;sum[++tot]=a[i].y;} }sort(sum+1,sum+1+tot); for(int i=1;i<=tot;i++) old[sum[i]]=i;for(int i=1;i<=n;i++){a[i].x=old[a[i].x];a[i].y=old[a[i].y];} for(int i=1;i<=tot;i++) fa[i]=i; for(int i=1;i<=n;i++){int p=find(a[i].x),q=find(a[i].y);if(a[i].c==1&&p!=q) fa[p]=q;if(a[i].c!=1&&p==q){flag=1;break;}}if(flag==1){printf("NO\n");continue;}for(int i=1;i<=n;i++){int p=find(a[i].x),q=find(a[i].y);if(a[i].c==1&&p!=q){flag=1;break;}if(a[i].c==0&&p==q){flag=1;break;}}if(flag==1)printf("NO\n");else printf("YES\n");}return 0; }?
轉載于:https://www.cnblogs.com/Peper/p/8996935.html
總結
以上是生活随笔為你收集整理的bzoj4195(并查集+离散化)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [原]详解如何将cocos2dx项目编译
- 下一篇: 透明明兼容