Cod sursa(job #1460975)

Utilizator george_stelianChichirim George george_stelian Data 14 iulie 2015 14:46:09
Problema Nowhere-zero Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.34 kb
#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[100010],pos[100010],sol[100010];
vector<int> v[100010],g[100010],q;
vector<char> vaz[100010];
set<pair<int,int> > h;
int zone[100010][2],grad[100010],cul[100010],cap[100010],nod_cur;
char vaz1[100010];

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=0;;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);
    }
    return 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;
}