Pagini recente » Cod sursa (job #2703137) | Cod sursa (job #1463651) | Rating Nastase Liviu (marS003) | Cod sursa (job #1187590) | Cod sursa (job #1460978)
#include <cstdio>
#include <cmath>
#include <vector>
#include <algorithm>
#include <set>
using namespace std;
struct punct
{
double x,y;
}point[100010];
struct muchie
{
int x,y;
muchie(int x1=0,int y1=0) {x=x1;y=y1;}
}edge[300010],pos[300010],sol[300010];
vector<int> v[100010],g[300010],q;
vector<char> vaz[100010];
set<pair<int,int> > h;
int zone[300010][2],grad[300010],cul[300010],cap[300010],nod_cur;
char vaz1[300010];
int cmp(int a,int b)
{
int nod1=edge[a].x^edge[a].y^nod_cur;
int nod2=edge[b].x^edge[b].y^nod_cur;
return atan2(point[nod1].y-point[nod_cur].y,point[nod1].x-point[nod_cur].x)<atan2(point[nod2].y-point[nod_cur].y,point[nod2].x-point[nod_cur].x);
}
void getzone(int nod,int whatedge,int zona)
{
int start=nod;
do
{
vaz[nod][whatedge]=1;
int a=v[nod][whatedge];
int urm=edge[a].x^edge[a].y^nod;
if(zone[a][0]) zone[a][1]=zona;
else
{
zone[a][0]=zona;
sol[a]=muchie(nod,urm);
}
if(urm==edge[a].x) whatedge=(pos[a].x+1)%v[urm].size();
else whatedge=(pos[a].y+1)%v[urm].size();
nod=urm;
}while(nod!=start);
}
void colorgraph(int n)
{
for(int i=1;i<=n;i++)
{
grad[i]=g[i].size();
h.insert({grad[i],i});
}
while(!h.empty())
{
pair<int,int> a=*h.begin();
h.erase(a);
if(vaz1[a.second]) continue;
vaz1[a.second]=1;
q.push_back(a.second);
for(vector<int>::iterator it=g[a.second].begin();it!=g[a.second].end();it++)
{
h.erase({grad[*it],*it});
grad[*it]--;
h.insert({grad[*it],*it});
}
reverse(q.begin(),q.end());
for(vector<int>::iterator it=q.begin();it!=q.end();it++)
{
int s=0;
for(vector<int>::iterator it1=g[*it].begin();it1!=g[*it].end();it1++) s|=1<<cul[*it1];
for(int i=1;;i++)
if((s&(1<<i))==0)
{
cul[*it]=i;
break;
}
}
}
}
int main()
{
freopen("nowhere-zero.in", "r", stdin);
freopen("nowhere-zero.out", "w", stdout);
int n,m,nrzone=0;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) scanf("%lf%lf",&point[i].x,&point[i].y);
for(int i=1;i<=m;i++)
{
scanf("%d%d",&edge[i].x,&edge[i].y);
v[edge[i].x].push_back(i);
v[edge[i].y].push_back(i);
}
for(int i=1;i<=n;i++)
{
nod_cur=i;
sort(v[i].begin(),v[i].end(),cmp);
for(int j=0;j<v[i].size();j++)
if(i==edge[v[i][j]].x) pos[v[i][j]].x=j;
else pos[v[i][j]].y=j;
vaz[i].resize(v[i].size(),0);
}
for(int i=1;i<=n;i++)
for(int j=0;j<v[i].size();j++)
if(!vaz[i][j]) getzone(i,j,++nrzone);
for(int i=1;i<=m;i++)
{
g[zone[i][0]].push_back(zone[i][1]);
g[zone[i][1]].push_back(zone[i][0]);
}
colorgraph(nrzone);
for(int i=1;i<=m;i++)
{
cap[i]=cul[zone[i][0]]-cul[zone[i][1]];
if(cap[i]<0)
{
cap[i]=-cap[i];
swap(sol[i].x,sol[i].y);
}
}
for(int i=1;i<=m;i++) printf("%d %d %d\n",sol[i].x,sol[i].y,cap[i]);
return 0;
}