Cod sursa(job #1896842)

Utilizator alex99Chelba Alexandru alex99 Data 28 februarie 2017 22:25:35
Problema Ubuntzei Scor 45
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.63 kb
#include <bits/stdc++.h>
#define inf 0x3f3f3f3f
using namespace std;
ifstream f("ubuntzei.in");
ofstream g("ubuntzei.out");
int n,m,k,d[2001];
int prieten[2001],l[2001][2001];
int minn=inf,x[2001],viz[2001];
vector<pair<int, int> > a[2001];
queue<int> q;
void dijkstra(int x)
{
    memset(d,inf,sizeof(d));
    q.push(x); d[x]=0;
    while(!q.empty())
    {
        int w=q.front();
        q.pop();
        for(int i=0;i<a[w].size();i++)
        if(d[a[w][i].first]>d[w]+a[w][i].second)
        {
            d[a[w][i].first]=d[w]+a[w][i].second;
            q.push(a[w][i].first);
        }
    }
}
int sum()
{
    int s=l[1][prieten[x[1]]]+l[prieten[x[k]]][n];
    if(k>=2)
    {
        for(int i=1;i<k;i++)
            s+=l[prieten[x[i]]][prieten[x[i+1]]];
    }
    return s;
}
void backt(int j)
{
    for(int i=1;i<=k;i++)
    if(!viz[i])
    {
        x[j]=i;
        viz[i]=1;
        if(j<k) backt(j+1);
        else{
            int s=sum();
            if(minn>s&&s) minn=s;
        }
        viz[i]=0;
    }
}
int main()
{
    f>>n>>m>>k;
    for(int i=1;i<=k;i++)
        f>>prieten[i];
    for(int i=1;i<=m;i++)
    {
        int x,y,z;
        f>>x>>y>>z;
        a[x].push_back({y,z});
        a[y].push_back({x,z});
    }
    dijkstra(1);
    for(int j=1;j<=n;j++)
        l[1][j]=d[j];
    dijkstra(n);
    for(int j=1;j<=n;j++)
        l[n][j]=d[j];
    for(int i=1;i<=k;i++)
    {
        dijkstra(prieten[i]);
        for(int j=1;j<=n;j++)
            l[prieten[i]][j]=d[j];
    }
    if(k>0) {backt(1); g<<minn<<'\n';}
    else g<<l[1][n]<<'\n';
    return 0;
}