Cod sursa(job #1624335)

Utilizator bt.panteaPantea Beniamin bt.pantea Data 2 martie 2016 10:22:28
Problema Ubuntzei Scor 45
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.88 kb
#include <iostream>
#include <fstream>
#define INF 1000000
#define MAX 2010
using namespace std;
ifstream f ("ubuntzei.in");
ofstream g ("ubuntzei.out");
int C[MAX],D[MAX],S[MAX],PA[MAX],PB[MAX],n,m,k,K,SumMin=INF;

struct Muchie
{
    int x,y,c;
}U[10010];

struct listacosturi
{
    int next,c;
}a[MAX][MAX],b[MAX][MAX];


bool FR[MAX];
void Read();
void Dijkstra(int k);
void Back(int k, int sum, int cont);

int main()
{
    Read();
    for (int i=1;i<=k;i++)
        Dijkstra(C[i]);
    Dijkstra(1);
    for (int i=1;i<=n;i++)
    {
        S[i]=0;
        b[n][i]=b[i][n];
    }
    Back(1,0,1);
    g<<SumMin;
    return 0;
}
void Back(int k, int sum, int cont)
{
    S[k]=1;
    if (n==k && cont==K+2&&sum<SumMin) SumMin=sum;
    for (int i=1;i<=PB[k];i++)
        //if (FR[i]==true && b[k][i]!=0 && S[i]==0) Back(i,sum+b[k][i], cont+1);
        if (S[b[k][i].next]==0) Back(b[k][i].next,sum+b[k][i].c,cont+1);
    S[k]=0;
}
void Read()
{
    f>>n>>m>>k;
    K=k;
    for (int i=1;i<=k;i++)
    {
        f>>C[i];
        FR[C[i]]=true;
    }
    FR[1]=FR[n]=true;
    for (int i=1;i<=m;i++)
    {
        int x,y,c;
        f>>x>>y>>c;
        PA[x]++;
        PA[y]++;
        a[x][PA[x]].next=y;
        a[y][PA[y]].next=x;
        a[x][PA[x]].c=a[y][PA[y]].c=c;
    }
}
void Dijkstra(int k)
{
    int u=k;
    for (int i=1;i<=n;i++)
        D[i]=INF,S[i]=0;
    D[k]=0;
    int q=1;
    while (q<=n)
    {
        int Min=INF;
        S[u]=1;
        for (int i=1;i<=PA[u];i++)
            if (D[a[u][i].next]>D[u]+a[u][i].c) D[a[u][i].next]=D[u]+a[u][i].c;

        for (int i=1;i<=n;i++)
            if (D[i]<Min&&S[i]==0) u=i,Min=D[i];
        q++;
    }
    for (int i=1;i<=n;i++)
        if (FR[i]==true)
        {
            PB[k]++;
            b[k][PB[k]].next=i;
            b[k][PB[k]].c=D[i];
        }
}