sgu174 walls 并查集 + 哈希

提议:给定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;
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值