题目链接:http://acm.sgu.ru/problem.php?contest=0&problem=174
题意:给出你N条线段,然后让你输出围成一个封闭图形的第一条线段,任意两条线段只可能在端点相交。
思路:
(1) 把坐标hash然后用并查集来判。
(2) 把坐标用map映射 然后用map来建并查集~~。
(1)思路code:
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
typedef long long LL;
const int maxn=200500;
LL b[maxn<<1];
struct line
{
int x0,y0,x1,y1;
int id0,id1;
} pp[maxn];
int par[maxn<<2];
int Find(int x)
{
if(x==par[x]) return x;
else return par[x]=Find(par[x]);
}
void unit(int x,int y)
{
x=Find(x); y=Find(y);
if(x==y) return ;
else par[x]=y;
}
bool same(int x,int y)
{
return Find(x)==Find(y);
}
int main()
{
int M,ta;
bool flag;
while(scanf("%d",&M)!=EOF){
ta=0;
for(int i=0;i<M;i++){
scanf("%d%d%d%d",&pp[i].x0,&pp[i].y0,&pp[i].x1,&pp[i].y1);
b[ta++]=(LL)pp[i].x0*1000000+pp[i].y0;
b[ta++]=(LL)pp[i].x1*1000000+pp[i].y1;
}
sort(b,b+ta);
int size=unique(b,b+ta)-b;
for(int i=0;i<M;i++){
pp[i].id0=lower_bound(b,b+size,(LL)pp[i].x0*1000000+pp[i].y0)-b;
pp[i].id1=lower_bound(b,b+size,(LL)pp[i].x1*1000000+pp[i].y1)-b;
}
for(int i=0;i<maxn<<1;i++) par[i]=i;
flag=false;
for(int i=0;i<M;i++){
if(same(pp[i].id0,pp[i].id1)){
printf("%d\n",i+1);
flag=true;
break;
}
else unit(pp[i].id0,pp[i].id1);
}
if(!flag) printf("0\n");
}
return 0;
}
(2)思路code:
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <map>
using namespace std;
const int maxn=200500;
map<pair<int,int>,pair<int,int> > par;
pair<int,int> Find(pair<int,int> x)
{
if(x==par[x]) return x;
else return par[x]=Find(par[x]);
}
void unit(pair<int,int> x,pair<int,int> y)
{
x=Find(x); y=Find(y);
if(x==y) return ;
else par[x]=y;
}
bool same(pair<int,int> x,pair<int,int> y)
{
return Find(x)==Find(y);
}
int x0[maxn<<1],y0[maxn<<1],x1[maxn<<1],y1[maxn<<1];
int main()
{
int M;
bool flag;
while(scanf("%d",&M)!=EOF){
for(int i=0;i<M;i++){
scanf("%d%d%d%d",&x0[i],&y0[i],&x1[i],&y1[i]);
par[make_pair(x0[i],y0[i])]=make_pair(x0[i],y0[i]);
par[make_pair(x1[i],y1[i])]=make_pair(x1[i],y1[i]);
}
flag=false;
for(int i=0;i<M;i++){
if(same(make_pair(x0[i],y0[i]),make_pair(x1[i],y1[i]))){
printf("%d\n",i+1);
flag=true;
break;
}
else unit(make_pair(x0[i],y0[i]),make_pair(x1[i],y1[i]));
}
if(!flag) printf("0\n");
}
return 0;
}