sgu 174 Walls

题意:在第几条线时已有的线组成了封闭图形。

并查集在当前直线将2点检查是否已经连起来了。已经连起来就输出,否则连起来。

#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <iomanip>
#include <cstring>
#include <map>
#include <queue>
#include <set>
#include <cassert>
#define mkp make_pair
using namespace std;
const double EPS=1e-8;
const int SZ=800010,INF=0x7FFFFFFF;
typedef long long lon;
int p[SZ];
int n;
vector<pair<int,int>> vct;
vector<pair<int,int> >ls;

void init()
{
    cin>>n;
    vct.assign(2*n,mkp(0,0));
    for(int i=0;i<2*n;++i)
    {
        cin>>vct[i].first>>vct[i].second;
        ls.push_back(vct[i]);
    }
    sort(ls.begin(),ls.end());
    ls.erase(unique(ls.begin(),ls.end()),ls.end());
    for(int i=0;i<SZ;++i)p[i]=i;
}

int find(int x)
{
    return x==p[x]?x:p[x]=find(p[x]);
}

void adj(int x,int y)
{
    int rtx=find(x),rty=find(y);
    p[rtx]=rty;
}

int main()
{
    std::ios::sync_with_stdio(0);
    //freopen("d:\\1.txt","r",stdin);
    lon casenum;
    //cin>>casenum;
    //for(lon time=1;time<=casenum;++time)
    {
        init();
        int res=0;
        for(int i=0;i<n;++i)
        {
            
            int pos1=lower_bound(ls.begin(),ls.end(),vct[2*i])-ls.begin();
            int pos2=lower_bound(ls.begin(),ls.end(),vct[2*i+1])-ls.begin();
            //cout<<i<<" "<<pos1<<" "<<pos2<<endl;
            if(find(pos1)==find(pos2))
            {
                res=i+1;
                break;
            }
            else
            {//cout<<"h"<<endl;
                adj(pos1,pos2);
            }
        }
        cout<<res<<endl;
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/gaudar/p/9790815.html
sgu