Cod sursa(job #1838264)

Utilizator alex99Chelba Alexandru alex99 Data 31 decembrie 2016 16:12:13
Problema Ubuntzei Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.86 kb
#include <fstream>
#define pinf 20000000
using namespace std;
ifstream f("ubuntzei.in");
ofstream g("ubuntzei.out");
int n,m,s[101],d[101],t[101],ok,a[101][101],r,punct[101],k,b[101][101],c;
int punere(int nr, int k)
{
    for(int i=1;i<=k;i++)
        if(nr==punct[i]) return 1;
    return 0;
}
void citire()
{
    f>>n>>m;
    f>>k;
    for(int i=1;i<=k;i++) f>>punct[i];
    int x,y;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
        a[i][j]=pinf;
    int nr=0;
    for(int i=1;i<=m;i++)
    {
        nr++;
        f>>x>>y>>c;
        a[x][y]=c;
        if(punere(nr,k)) b[x][y]=1;
    }
}
void cauta_min(int &vf)
{
    int minn=pinf;
    for(int i=1;i<=n;i++)
    if(!s[i])
        if(d[i]<minn)
        {
            minn=d[i];
            vf=i;
        }
}
void imbunatatire_drum(int vf)
{
    for(int i=1;i<=n;i++)
    if(s[i]==0)
        if(d[i]>d[vf]+a[vf][i])
        {
            d[i]=d[vf]+a[vf][i];
            t[i]=vf;
        }
}
void drum(int i)
{
    if(t[i]) drum(t[i]);
    g<<i<<" "; if(punere(i,k)) ok=1;
}
void afiseaza_vector(int v[101])
{
    for(int i=1;i<=n;i++)
        g<<v[i]<<" ";
    g<<'\n';
}
int main()
{
    int vf,minn;
    citire();
    r=1;
    for(int i=1;i<=n;i++)
    if(i!=r)
    {
        d[i]=a[r][i];
        if(a[r][i]!=pinf)
            t[i]=r;
    }
    for(int i=1;i<=n-1;i++)
    {
        cauta_min(vf);
        s[vf]=1;
        imbunatatire_drum(vf);
    }
    ///afiseaza_vector(d);
    ///afiseaza_vector(s);
    ///afiseaza_vector(t);
    ///g<<'\n';
    for(int i=1;i<=n;i++)
    if(i==n)
        if(t[i]!=0)
        {
            ///g<<r<<" "<<i<<'\n';
            ///drum(i);
            if(ok)
            g<<d[i]<<'\n';
            else g<<0;
        }
        ///else g<<"nu exista de la "<<r<<" la "<<i<<'\n';
    return 0;
}