Cod sursa(job #959270)

Utilizator crushackPopescu Silviu crushack Data 8 iunie 2013 10:59:07
Problema Nowhere-zero Scor 10
Compilator cpp Status done
Runda Infoarena Cup 2013 Marime 1.29 kb
#include <stdio.h>
#include <vector>
#define NMax 100010
using namespace std;

const char IN[]="nowhere-zero.in",OUT[]="nowhere-zero.out";

int N,M;
bool b[NMax];
int in[NMax],out[NMax],lv[NMax];
vector<int> ad[NMax];

void solve(int x,int p=0){

    b[x]=true;lv[x]=lv[p]+1;
    for (int i=0;i<(int)ad[x].size();++i) if (ad[x][i]!=p){
        if (!b[ad[x][i]]) solve(ad[x][i],x);
        else if (lv[ad[x][i]]<lv[x]){
            ++out[x];++in[ad[x][i]];
            printf("%d %d 1\n",x,ad[x][i]);
        }
    }

}

void df(int x,int carry=0){

    b[x]=true;
    for (int i=0;i<(int)ad[x].size();++i) if (!b[ad[x][i]]){

        printf("%d %d %d\n",x,ad[x][i],carry+in[x]-out[x]);

        df(ad[x][i],carry+in[x]-out[x]);
    }

}

void c(){
    for (int i=1;i<=N;++i) b[i]=false;
}

int main()
{
    int i,x,y;
    double a,bb;
    freopen(IN,"r",stdin);
    scanf("%d%d",&N,&M);
    for (i=1;i<=N;++i) scanf("%lf%lf",&a,&bb);
    while (M--){
        scanf("%d%d",&x,&y);
        //printf("%d %d\n",x,y);
        ad[x].push_back(y);
        ad[y].push_back(x);
    }
    fclose(stdin);

    freopen(OUT,"w",stdout);
    for (i=1;i<=N;++i) if (!b[i]) solve(i);
    c();
    for (i=1;i<=N;++i) if (!b[i]) df(i);
    fclose(stdout);

    return 0;
}