Cod sursa(job #1712001)

Utilizator ionutthekingManu Andrei Ionut ionuttheking Data 1 iunie 2016 19:24:31
Problema Sate Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.05 kb
#include<iostream>
#include<fstream>
#include <stdlib.h>

using namespace std;

ifstream f("sate.in");
ofstream g("sate.out");


int **init_mat_cost(int n)
{
    int **a=(int **)malloc(n*sizeof(int *));
    for(int i=0;i<n;i++) a[i]=(int *)calloc(n,sizeof(int));
    for(int i=0; i<n; i++)
        for(int j=0; j<n; j++)
            if (i==j) a[i][j]=0;
            else if(i<j) a[i][j]=9999;
            else if(i>j) a[i][j]=-9999;
    return a;
}
int **citire_date(int &n,int &nod1,int &nod2)
{
    int m;
    f>>n>>m>>nod1>>nod2;
    nod1--;
    int **a=init_mat_cost(n);
    for(int i=0; i<m; i++)
    {
        int x,y;
        f>>x>>y;
        f>>a[x-1][y-1];
        a[y-1][x-1]=a[x-1][y-1];
    }
    return a;
}

void init(int **&a,int *&c,int *&viz,int *&prec,int nod1,int n)
{
    c=(int *)calloc(n,sizeof(int));
    viz=(int *)calloc(n,sizeof(int));
    prec=(int *)calloc(n,sizeof(int));
    for(int i=0; i<n; i++)
    {
        c[i]=a[nod1][i];
        if (c[i]<9999 && c[i]>0 && c[i]!=0) prec[i]=nod1;
        else prec[i]=0;
    }

    viz[nod1]=1;
    prec[nod1]=0;
    c[nod1]=0;
}

void dijkstra(int **&a,int *&viz,int *&prec,int *&c,int n)
{
    int nod,vmin,j,gasit;
    do
    {
        gasit=0;
        vmin=9999;
        for(j=0; j<n; j++)
            if ((viz[j]==0)&&(c[j]<vmin))
            {
                gasit=1;
                vmin=c[j];
                nod=j;
            }
        viz[nod]=1;
        for(j=0; j<n; j++)
        if(nod<j)
        {
            if ((viz[j]==0)&&(c[nod]+a[nod][j]<c[j]))
            {
                c[j]=c[nod]+a[nod][j];
                prec[j]=nod;
            }
        }
        else if(nod>j)
        {
            if ((viz[j]==0)&&(c[nod]-a[nod][j]<c[j]))
            {
                c[j]=c[nod]-a[nod][j];
            }
        }

    }
    while (gasit);
}
int main()
{
    int **a,*viz,*c,*pred,n,nod1,nod2;
    a=citire_date(n,nod1,nod2);
    init(a,c,viz,pred,nod1,n);
    dijkstra(a,viz,pred,c,n);
    g<<c[nod2-1];
}