Cod sursa(job #1624183)

Utilizator ionut98Bejenariu Ionut Daniel ionut98 Data 2 martie 2016 08:55:37
Problema Ubuntzei Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.47 kb
#include<fstream>
#include<algorithm>
#define inf 1<<30
using namespace std;
ifstream f("ubuntzei.in");
ofstream g("ubuntzei.out");
int n,m,i,k,d[2005],xx,nr,mat[2005][2005],j,plec,fin;
struct localitati
{
    int x,y,c;
}a[20005];
bool viz[2005],ok;
struct loc
{
    int poz,cost,dist1;
}v[20];
void dijkstra(int nod)
{
    for(i=1;i<=n;i++)
      d[i]=inf;
    d[nod]=0;
    for(i=1;i<=m;i++)
      if(a[i].x==nod)
        d[a[i].y]=a[i].c;
    do
    {
        ok=1;
        for(i=1;i<=m;i++)
          if(d[a[i].y]>d[a[i].x]+a[i].c)
          {
              d[a[i].y]=d[a[i].x]+a[i].c;
              ok=0;
          }
    }while(ok==0);
    if(viz[nod]==1)
    {
        nr++;
        v[nr].poz=nod;
        v[nr].cost=d[n];
        v[nr].dist1=mat[1][nod];
    }
    for(i=1;i<=n;i++)
      mat[nod][i]=d[i];
}
bool cmp(loc nr1,loc nr2)
{
    if(nr1.cost!=nr2.cost)
      return nr1.cost>nr2.cost;
    return nr1.dist1<nr2.dist1;
}
int main()
{
    f>>n>>m;
    f>>k;
    for(int i=1;i<=k;i++)
    {
        f>>xx;
        viz[xx]=1;
    }
    for(int i=1;i<=m;i++)
    {
        f>>a[i].x>>a[i].y>>a[i].c;
        a[i+m].y=a[i].x;
        a[i+m].x=a[i].y;
        a[i+m].c=a[i].c;
    }
    m*=2;
    for(int i=1;i<=n;i++)
      dijkstra(i);
    sort(v+1,v+k+1,cmp);
    plec=1;
    for(i=1;i<=k;i++)
    {
        fin+=mat[plec][v[i].poz];
        plec=v[i].poz;
    }
    fin+=mat[plec][n];
    g<<fin;
    return 0;
}