标签:
简单的并查集的题目
最好自己写
看题解没意思
#include<stdio.h> #include<string.h> #include<algorithm> #include<map> #define maxn 1111 using namespace std; float line[maxn][5]; int l; int fa[maxn]; int big[maxn]; int seek(int x) { return fa[x]==x?x:fa[x]=seek(fa[x]); } void Merge(int u ,int v) { int fu = seek(u); int fv = seek(v); if(fu != fv) { fa[fv] = fu ; big[fu] += big[fv]; big[fv] = 0 ; } } float pos(float x1,float y1,float x2,float y2,float x,float y) { return y-(y2-y1)/(x2-x1)*(x-x1)-y1; } void cross(float x1,float y1,float x2,float y2) { int i; for(i=1;i<l;i++) if(pos(line[i][0],line[i][1],line[i][2],line[i][3],x1,y1)*pos(line[i][0],line[i][1],line[i][2],line[i][3],x2,y2)<=0) if(pos(x1,y1,x2,y2,line[i][0],line[i][1])*pos(x1,y1,x2,y2,line[i][2],line[i][3])<=0) { Merge(l,i); } // return -1; } void init() { int i; for(i=0;i<maxn;i++) fa[i]=i; } int main() { int t,n,i; char com; int num; scanf("%d",&t); while(t--) { scanf("%d",&n); l=1; for(i=0;i<maxn;i++) big[i]=1; init(); i=0; while(i<n) { scanf("%c",&com); if(com=='Q') { scanf("%d",&num); int nn=seek(num); printf("%d\n",big[nn]); //printf("--------------\n"); i++; } else if (com=='P') { scanf("%f%f%f%f",&line[l][0],&line[l][1],&line[l][2],&line[l][3]); cross(line[l][0],line[l][1],line[l][2],line[l][3]); l++; i++; } // printf("--------------\n"); } // system("pause"); if(t!=0)printf("\n"); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/whereyousink/article/details/47322229