标签:
【题目大意】
在实现程序自动分析的过程中,常常需要判定一些约束条件是否能被同时满足。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<vector> 6 using namespace std; 7 const int MAXN=2000000+500; 8 struct node 9 { 10 int num; 11 int oripos; 12 int ab;//0a1b 13 bool operator < (const node &x) const 14 { 15 return num<x.num; 16 } 17 }que[MAXN]; 18 int h[MAXN],u[MAXN]; 19 int n,a[MAXN],b[MAXN],e[MAXN]; 20 21 void union_set(int a,int b) 22 { 23 if (h[a]>=h[b]) 24 { 25 u[b]=a; 26 if (h[a]==h[b]) h[a]++; 27 } 28 else u[a]=b; 29 } 30 31 int find(int x) 32 { 33 int r=x; 34 while (u[r]!=r) r=u[r]; 35 int p=x; 36 while (u[p]!=p) 37 { 38 int tmp=u[p]; 39 u[p]=r; 40 p=tmp; 41 } 42 return r; 43 } 44 45 46 void init() 47 { 48 scanf("%d",&n); 49 int qlen=-1; 50 for (int i=0;i<n;i++) 51 { 52 scanf("%d%d%d",&a[i],&b[i],&e[i]); 53 que[++qlen].num=a[i]; 54 que[qlen].oripos=i; 55 que[qlen].ab=0; 56 que[++qlen].num=b[i]; 57 que[qlen].oripos=i; 58 que[qlen].ab=1; 59 } 60 sort(que,que+2*n); 61 int j=0; 62 for (int i=0;i<2*n;i++) 63 { 64 if (i!=0 && que[i].num!=que[i-1].num) j++; 65 if (que[i].ab==0) a[que[i].oripos]=j; 66 else b[que[i].oripos]=j; 67 } 68 memset(h,0,sizeof(h)); 69 for (int i=0;i<=2*(n+2);i++) u[i]=i; 70 } 71 72 int judge() 73 { 74 for (int i=0;i<n;i++) 75 if (e[i]) 76 { 77 union_set(find(a[i]),find(b[i])); 78 } 79 for (int i=0;i<n;i++) 80 if (!e[i]) 81 { 82 int fa=find(a[i]),fb=find(b[i]); 83 if (fa==fb) return 0; 84 } 85 return 1; 86 } 87 88 int main() 89 { 90 int T; 91 scanf("%d",&T); 92 while (T--) 93 { 94 init(); 95 int j=judge(); 96 if (j) cout<<"YES"<<endl;else cout<<"NO"<<endl; 97 } 98 return 0; 99 }
【并查集+离散化】BZOJ4195- [Noi2015]程序自动分析
标签:
原文地址:http://www.cnblogs.com/iiyiyi/p/5648172.html