64,636
社区成员
发帖
与我相关
我的任务
分享
#include<iostream>
using namespace std;
//#define MIN(x,y) ( ( x ) < ( y ) ? ( x ) : ( y ) )
//#define MAX(x,y) ( ( x ) > ( y ) ? ( x ) : ( y ) )
int Father[100];
int Rank[100];
int MIN(int a,int b)
{
return a < b ? a : b;
}
int MAX(int a,int b)
{
return a > b ? a : b;
}
struct Point
{
int x,y;
}M[100][2];
int cross(Point O,Point A,Point B)
{
int x1 = A.x - O.x;
int y1 = A.y - O.y;
int x2 = B.x - O.x;
int y2 = B.y - O.y;
return (x1 * y2 - y1 * x2);
}
bool Is_Inter(Point &A,Point &B,Point &C,Point &D)
{
return
(MIN(A.x,B.x) <= MAX(C.x,D.x))
&& (MIN (C.x,D.x) <= MAX(A.x,B.x))
&& (MIN(A.y,B.y) <= MAX(C.y,D.y))
&& (MIN(C.y,D.y) <= MAX(A.y,B.y))
&& (cross(A,C,B) * cross(A,B,D) >= 0)
&& (cross(C,A,D) * cross(A,D,B) >= 0);
}
int Get_Father(int x)
{
if (x != Father[x])
{
Father[x] = Get_Father(Father[x]);
}
return Father[x];
}
void Union(int a,int b)
{
int fa,fb;
fa = Get_Father(a);
fb = Get_Father(b);
if(fa != fb)
{
if(Rank[fa] > Rank[fb]) Father[fb] = fa;
else
{
Father[fa] = fb;
if(Rank[fa] == Rank[fb])
Rank[fb]++;
}
}
}
bool Connected(int a,int b)
{
int fa = Get_Father(a);
int fb = Get_Father(b);
if(fa == fb) return true;
else return false;
}
int main()
{
int n;
while(scanf("%d",&n))
{
if(n == 0) break;
memset(Rank,0,sizeof(Rank));
int i;
for(i=0;i<n;i++) Father[i] = i;
for(i=0;i<n;i++)
scanf("%d %d %d %d",&M[i][0].x,&M[i][0].y,&M[i][1].x,&M[i][1].y);
int j;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
if(Is_Inter(M[i][0],M[i][1],M[j][0],M[j][1]) && i != j)
Union(i,j);
int a,b;
while(scanf("%d %d",&a,&b))
{
if(a == 0 && b == 0) break;
if(Connected(a-1,b-1)) printf("CONNECTED\n");
else printf("NOT CONNECTED\n");
}
}
// system("pause");
return 0;
}
#include<iostream>