Cod sursa(job #1131570)

Utilizator DanielPasereDaniel Pasere DanielPasere Data 28 februarie 2014 21:43:48
Problema Ubuntzei Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.61 kb
#include <fstream>
#include<iostream>
#include<windows.h>
using namespace std;
int n,m,k,b[16],c[2001][2001],s,v[1001];
ifstream f("ubuntzei.in");
ofstream g("ubuntzei.out");
void citire()
{
    f>>n>>m;
    f>>k;
    for(int i=1;i<=k;i++)
        f>>b[i];
    int x,y,z;
   for(int i=1;i<=m;i++)
   {
       f>>x>>y>>z;
       c[x][y]=c[y][x]=z;
   }
   for(int i=1;i<=n;i++)
    for(int j=1;j<=n;j++)
        if(i!=j&&c[i][j]==0)
            c[i][j]=100000;
}
void roy_floyd()
{
    for(int t=1;t<=n;t++)
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                if(c[i][t]!=100000&&c[t][j]!=100000)
                  if(c[i][j]>c[i][t]+c[t][j])
                            c[i][j]=c[i][t]+c[t][j];
}
int minim(int nod)
{
    int min=100000,aux;
    for(int i=1;i<=k;i++)
        {
            if(c[nod][b[i]]<min&&v[b[i]]==0&&nod!=b[i])
            {

                min=c[b[i]][nod];
                aux=b[i];
            }}
            return aux;
}
int verif(int k)
{

    for(int i=1;i<=k;i++)
        if (v[b[i]]==0)
            return 0;
    return 1;
}
int parcurgere()
{
    int na,np=1;
    v[1]=1;
    na=minim(np);
    while(!verif(k))
        {
            s+=c[np][na];
            np=na;
            na=minim(np);
            if(na==np)
                s+=c[na][n];
            v[np]=1;
            }
    return s;
}
void afisare()
{
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
            cout<<c[i][j]<<" ";

    cout<<'\n';}
}
int main()
{citire();
roy_floyd();
//afisare();
parcurgere();
g<<s;
}