并查集+map——BZOJ4195Luogu1955 [Noi2015]程序自动分析

xiaoxiao2021-02-28  104

题面:BZOJ4195 Luogu1955 由于这个区间范围挺大的,但是点不多,所以考虑离散化 离散化之后呢就直接并查集就好了 等于的直接合并,不等于的判断是否在同一连通块里 要注意的是要所有合并完之后才能判断不等于的情况 离散化用的std::map

#include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <iostream> #include <cstdlib> #include <map> #include <ctime> #include <queue> #include <climits> using namespace std; map<int,int>mp; int fa[200001]; struct ppap{int x,y,v;}a[100001]; inline bool cmp(ppap a,ppap b){return a.v>b.v;} inline int getfather(int v){return fa[v]==v?v:fa[v]=getfather(fa[v]);} int main() { int T,n,m;scanf("%d",&T); while(T--){ mp.clear();m=0; scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].v); if(!mp[a[i].x])mp[a[i].x]=++m; if(!mp[a[i].y])mp[a[i].y]=++m; a[i].x=mp[a[i].x];a[i].y=mp[a[i].y]; } sort(a+1,a+n+1,cmp); for(int i=1;i<=2*n;i++)fa[i]=i; bool flag=1; for(int i=1;i<=n;i++){ int fx=getfather(a[i].x),fy=getfather(a[i].y); if(a[i].v)fa[fx]=fy; else if(fx==fy){flag=0;break;} } if(flag)puts("YES"); else puts("NO"); } return 0; }
转载请注明原文地址: https://www.6miu.com/read-50195.html

最新回复(0)