Pagini recente » Cod sursa (job #445288) | Cod sursa (job #1904200) | Cod sursa (job #2181635) | Cod sursa (job #743893) | Cod sursa (job #2766468)
#include <bits/stdc++.h>
using namespace std;
ifstream in("triangulare.in");
ofstream out("triangulare.out");
struct point
{
int ind;
int x,y;
}v[55],init[55];
int tst,n;
int sgn(int x)
{
if(x<0) return -1;
if(x==0) return 0;
return 1;
}
int dist(point a,point b)
{
return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);
}
bool mycmp(point a,point b)
{
return ((a.y-v[0].y)*(b.x-v[0].x)<(b.y-v[0].y)*(a.x-v[0].x) or
((a.y-v[0].y)*(b.x-v[0].x)==(b.y-v[0].y)*(a.x-v[0].x) and dist(v[0],a)<dist(v[0],b)));
}
int compare(point a,point b,point c)
{
return sgn((a.y-c.y)*(b.x-c.x)-(b.y-c.y)*(a.x-c.x));
}
int unde[55];
void arange(vector<int> &ordine,int minim)
{
vector<int> nou;
for(int i=unde[minim];i<ordine.size();++i)
nou.push_back(ordine[i]);
for(int i=0;i<unde[minim];++i)
nou.push_back(ordine[i]);
swap(nou,ordine);
nou.clear();
for(int i=0;i<ordine.size();++i)
unde[ordine[i]]=i;
}
vector<pair<int,int> > edge;
void solve(vector<int> ordine,int inferior)
{
if(ordine.size()==3)
return ;
int minim=60;
for(int x:ordine)
if(x>inferior)
minim=min(minim,x);
arange(ordine,minim);
int per=60,uu=-1;
for(int i=2;i<ordine.size()-1;++i)
if(ordine[i]<per and compare(init[ordine[0]],init[ordine[1]],init[ordine[i]])!=0)
per=ordine[i],uu=i;
if(per==60)
{
solve(ordine,minim);
return ;
}
vector<int> parte;
edge.push_back({ordine[0],ordine[uu]});
for(int i=0;i<=uu;++i)
parte.push_back(ordine[i]);
solve(parte,-1);
parte.clear();
parte.push_back(ordine[0]);
for(int i=uu;i<ordine.size();++i)
parte.push_back(ordine[i]);
solve(parte,-1);
}
int main()
{
in>>tst;
while(tst--)
{
in>>n;
for(int i=0;i<n;++i)
in>>v[i].x>>v[i].y,v[i].ind=i,init[i]=v[i];
for(int i=1;i<n;++i)
{
if(v[i].x<v[0].x) swap(v[0],v[i]);
else if(v[i].x==v[0].x and v[i].y<v[0].y) swap(v[0],v[i]);
}
sort(v+1,v+n,mycmp);
vector<int> ordine;
for(int i=0;i<n;++i)
unde[v[i].ind]=i,// cout<<v[i].ind<<' ',
ordine.push_back(v[i].ind);
solve(ordine,-1);
sort(edge.begin(),edge.end());
for(auto p:edge)
out<<p.first<<' '<<p.second<<'\n';
edge.clear();
// cout<<'\n';
}
return 0;
}