Pagini recente » Cod sursa (job #549693) | Cod sursa (job #2326502) | Cod sursa (job #345129) | Cod sursa (job #1237382) | Cod sursa (job #1928968)
#include <cstdio>
#include <set>
#include <cmath>
#include <algorithm>
#include <utility>
#include <map>
#define MAXN 100000
#define MAXK 200009
#define MAXM 600099
struct myc{
int x, y;
myc(int _x, int _y){
x=_x;
y=_y;
}
};
std::set <long long> graf;
int sef;
std::vector <bool> viz[MAXN+1];
std::vector <myc> g[MAXN+1];
std::map <int, int> mp[MAXN+1];
double x[MAXN+1], y[MAXN+1];
int a[MAXM], b[MAXM], moaca[MAXM];
bool done[MAXK+1], ok[7];
int q[MAXK+1], unde[MAXK+1], gr[MAXK+1];
char cul[MAXK+1];
std::vector <int> v[MAXK+1];
bool cmp(const myc &a, const myc &b){
return atan2(y[a.x]-y[sef], x[a.x]-x[sef])<atan2(y[b.x]-y[sef], x[b.x]-x[sef]);
}
int main(){
FILE *fin, *fout;
fin=fopen("nowhere-zero.in", "r");
fout=fopen("nowhere-zero.out", "w");
int n, m;
fscanf(fin, "%d%d", &n, &m);
for(int i=1; i<=n; i++)
fscanf(fin, "%lf%lf", &x[i], &y[i]);
for(int i=0; i<2*m; i+=2){
fscanf(fin, "%d%d", &a[i], &b[i]);
a[i+1]=b[i];
b[i+1]=a[i];
g[a[i]].push_back(myc(b[i], i));
g[b[i]].push_back(myc(a[i], i+1));
}
for(int i=1; i<=n; i++){
sef=i;
std::sort(g[i].begin(), g[i].end(), cmp);
for(int j=0; j<(int)g[i].size(); j++)
viz[i].push_back(0);
for(int j=0; j<(int)g[i].size(); j++)
mp[i][g[i][j].x]=j;
}
int k=0;
for(int i=1; i<=n; i++){
for(int j=0; j<(int)g[i].size(); j++) if(viz[i][j]==0){
int x=i;
myc y=g[i][j];
k++;
while(y.x!=i){
moaca[y.y]=k;
viz[x][mp[x][y.x]]=1;
int aux=x;
x=y.x;
int poz=mp[x][aux]-1;
if(poz==-1)
poz=g[x].size()-1;
y=g[x][poz];
}
moaca[y.y]=k;
viz[x][mp[x][y.x]]=1;
}
}
for(int i=0; i<2*m; i+=2){
if(graf.find((1LL<<30)*std::min(moaca[i], moaca[i+1])+std::max(moaca[i], moaca[i+1]))==graf.end()){
graf.insert((1LL<<30)*std::min(moaca[i], moaca[i+1])+std::max(moaca[i], moaca[i+1]));
v[moaca[i]].push_back(moaca[i+1]);
v[moaca[i+1]].push_back(moaca[i]);
}
}
int st=0, dr=0;
for(int i=1; i<=k; i++){
gr[i]=v[i].size();
if(gr[i]<=5){
unde[i]=dr;
q[dr++]=i;
done[i]=1;
}
}
while(st<dr){
for(auto x:v[q[st]]){
if(done[x]==0){
gr[x]--;
if(gr[x]==5){
unde[x]=dr;
q[dr++]=x;
done[x]=1;
}
}
}
st++;
}
for(int i=k-1; i>=0; i--){
for(int j=1; j<=6; j++)
ok[j]=1;
for(auto x:v[q[i]])
if(unde[x]>unde[q[i]])
ok[(int)cul[x]]=0;
for(int j=1; j<=6; j++)
if(ok[j])
cul[q[i]]=j;
}
for(int i=0; i<2*m; i+=2){
int sol;
if(cul[moaca[i]]>cul[moaca[i+1]])
sol=i;
else sol=i+1;
int ans=cul[moaca[sol]]-cul[moaca[sol^1]];
fprintf(fout, "%d %d %d\n", a[sol], b[sol], ans);
}
fclose(fin);
fclose(fout);
return 0;
}