提议:给定n个墙(线段) 求第一个出现封闭空间的墙编号
解析:可以看成无向图上的点的关系,当一个线段连接时如果出现环时候退出,用并查集维护连通性信息,点的映射用hash来做
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<map>
#define MAXN 400010
using namespace std;
struct point
{
int x,y;
};
bool operator <(const point &x,const point &y)
{
if(x.x!=y.x)return x.x<y.x;
return x.y<y.y;
}
struct segment
{
point a,b;
}a[MAXN];
int n,p[MAXN];
map<point,int>hash;
int findset(int &x)
{
if(p[x]!=x)
p[x]=findset(p[x]);
return p[x];
}
void solve()
{
for(int i=0;i<2*n;i++)
p[i]=i;
int cnt=0;
for(int i=1,u,v;i<=n;i++)
{
if(hash.count(a[i].a)) u=hash[a[i].a];
else u=hash[a[i].a]=cnt++;
if(hash.count(a[i].b)) v=hash[a[i].b];
else v=hash[a[i].b]=cnt++;
u=findset(u),v=findset(v);
if(u==v)
{
printf("%d\n",i);
return;
}
p[u]=v;
}
printf("0\n");
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
for(int i=1;i<=n;i++)
scanf("%d%d%d%d",&a[i].a.x,&a[i].a.y,&a[i].b.x,&a[i].b.y);
solve();
}
return 0;
}