Cod sursa(job #1081874)

Utilizator maritimCristian Lambru maritim Data 13 ianuarie 2014 22:25:49
Problema Sate Scor 100
Compilator cpp Status done
Runda Teme Pregatire ACM Unibuc 2013 Marime 1.68 kb
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
 
typedef struct _nod
{
    int info;
    long long cost;
    struct _nod *adr;
} nod;
 
typedef struct
{
    struct _nod *cap;
} list;
 
list A[30001];
int N;
int M;
int X;
int Y;
long long MAX = -1;
int viz[30001];
 
void add(int a,int b,int c)
{
    nod *nou = (nod*)malloc(sizeof(nod));
    nou->info = b;
    nou->cost = c;
    nou->adr = A[a].cap;
    A[a].cap = nou;
}
 
void citire(void)
{
    int a;
    int b;
    int c;
    FILE *f = fopen("sate.in","r");
     
    fscanf(f,"%d %d %d %d",&N,&M,&X,&Y);
    for(int i=1;i<=M;i++)
    {
        fscanf(f,"%d %d %d",&a,&b,&c);
        add(a,b,c);
        add(b,a,c);
    }
     
    fclose(f);
}
 
void add2(nod*& Cf,int a,int c)
{
    nod *nou = (nod*)malloc(sizeof(nod));
    nou->info = a;
    nou->cost = c;
    nou->adr = NULL;
    Cf->adr = nou;
    Cf = nou;
}
 
void parcurgere(void)
{
    nod *Ci = (nod*)malloc(sizeof(nod));
    Ci->info = X;
    Ci->cost = 0;
    nod *Cf = Ci;
    int gata = 1;
    while(Ci && gata)
    {
        if(Ci->info == Y)
        {
            MAX = Ci->cost;
            gata = 0;
        }
        nod *q = A[Ci->info].cap;
        while(q)
        {
            if(Ci->info-q->info && !viz[q->info])
            {
            viz[q->info] = 1;
            if(q->info<Ci->info)
                add2(Cf,q->info,Ci->cost-q->cost);
            else
                add2(Cf,q->info,Ci->cost+q->cost);
            }
            q = q->adr;
        }
        q = Ci;
        Ci = Ci->adr;
        free(q);
    }
}
 
int main()
{
    FILE *f = fopen("sate.out","w"); 
     
    citire();
    parcurgere();
    fprintf(f,"%lld",MAX);
     
    fclose(f);
    return 0;
}