Cod sursa(job #1569484)

Utilizator Vlad_lsc2008Lungu Vlad Vlad_lsc2008 Data 15 ianuarie 2016 16:59:09
Problema Ubuntzei Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.1 kb
#include<iostream>
#include <cstdio>
#include <queue>
#include <vector>
#include <cstring>
#include <algorithm>
#define nmax 2002
using namespace std;

struct nod{ int nxt,cst;};
int n,m1,k;
vector<nod> m[nmax];
int pri[18];
short num[nmax];
int d[nmax];
int dist[18][18];
vector<int> v;

class comp
{
public:
    bool operator()(int a,int b)
    {
        return d[a]>d[b];
    }
};
priority_queue<int,vector<int>,comp> q;

int dij(int row,int nd)
{
    int i,nd1;
    for(i=1;i<=n;i++) d[i]=0x3ffffff;
    d[nd]=0;

    q.push(nd);
    while(!q.empty())
    {
        nd1=q.top(); q.pop();
        for(i=0 ; i<m[nd1].size() ; i++)
            if(d[ m[nd1][i].nxt ] > d[nd1]+ m[nd1][i].cst )
            {
                if(num[ m[nd1][i].nxt ]) dist[row][ num[m[nd1][i].nxt] ]=d[ m[nd1][i].nxt ]= d[nd1] + m[nd1][i].cst;
                else d[ m[nd1][i].nxt ]= d[nd1] + m[nd1][i].cst;
                q.push( m[nd1][i].nxt );
            }
    }

}

int main()
{
    freopen("ubuntzei.in","r",stdin);
    freopen("ubuntzei.out","w",stdout);
    int i,j,n1,n2,cs;
    nod nod1;
    scanf("%d%d",&n,&m1);
    scanf("%d",&k);
    num[1]=1;
    for(i=1;i<=k;i++) { scanf("%d",&pri[i]); num[pri[i]]=i+1; }
    num[n]=k+2;
    for(;m1;m1--)
    {
        scanf("%d%d%d",&n1,&n2,&cs);
        nod1.nxt=n2; nod1.cst=cs;
        m[n1].push_back(nod1);
        nod1.nxt=n1;
        m[n2].push_back(nod1);
    }

    if(k==0)
    {
        dij(1,1);
        printf("%d\n",d[n]);
    }
    else
    {
        int maxim=-3;
        int dis;
        dij(1,1);
        for(i=1;i<=k;i++) dij(i+1,pri[i]);
        if(k>1)
        {
            for(i=2;i<=k+1;i++) v.push_back(i);
            do {
                dis=dist[1][v[0]];
                for (i = 0; i < k; ++i) { /*cout<<v[i]<<' ';*/ dis+=dist[v[i]][v[i+1]]; }
                if(dis>maxim) maxim=dis;
            } while (next_permutation(v.begin(), v.end()));
        }
        else maxim=dist[1][2]+dist[2][3];
        printf("%d\n",maxim);
    }

    fclose(stdin);
    fclose(stdout);
    return 0;
}