Cod sursa(job #890717)

Utilizator Bigb21Avram Bogdan Bigb21 Data 25 februarie 2013 11:32:57
Problema Ubuntzei Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.83 kb
#include<iostream>
#include<fstream>
#include<cstring>
#include<algorithm>
#define NMAX 2002
#define INF 9999999
using namespace std;
ifstream in("ubuntzei.in");
ofstream out("ubuntzei.out");
unsigned int n,m,Mat[NMAX][NMAX],v[10002],d[NMAX],viz[NMAX],k;
void read ()
 {

        in>>n>>m;

          for( unsigned int i=1; i<=n;  ++i )
              for( unsigned int j=i+1; j<=n; ++j )
                  if(i!=j)
                 Mat[i][j]=Mat[j][i]=INF;
                   else
                   Mat[i][j]=Mat[j][i]=0;


            unsigned int a,b,k,c;

        in>>k;
           v[0]=1;
        for(unsigned int i=1; i<=k; ++i)
                in>>v[i];
           v[k+1]=n;

        for(int i=1; i<=m; i++)
          {  in>>a>>b>>c;
             Mat[a][b]=Mat[b][a]=c;
          }


 }

int dijk(int inc , int fin)
{      unsigned int  min,ok=1,z;
        memset(viz,0,n);
     for(unsigned int i=1; i<=fin; i++)
        d[i]=Mat[inc][i];
          viz[inc]=1;

       while(ok)
        { min=INF;
           for(int i=1; i<=fin; ++i)
                 if(viz[i]==0 && min>d[i])
                   {
                       min=d[i];
                       z=i;
                   }

                   if(min!=INF)
                     {
                         viz[z]=1;
                         for(unsigned int i=1; i<=fin; i++)
                                if(!viz[i] && d[i]>d[z]+Mat[z][i])
                                    d[i]=d[z]+Mat[z][i];

                     }
                     else
                     ok=0;

                }


      return d[fin];
}
int main ()
{
  long s=0;
     read ();
      for(int i=0; i<=k+1; i++)
         {
           s=s+dijk(v[i],v[i+1]);
         }

    out<<s;
     in.close();
     out.close();
     return 0;

}