Cod sursa(job #955141)

Utilizator misinoonisim necula misino Data 30 mai 2013 22:29:01
Problema Ubuntzei Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.88 kb
#include<fstream>
#include<vector>
#include<queue>
#include<iostream>
#include<cstring>
#define pb push_back
//#define nod second
#define INF 0x3f3f3f3f
//#define cost first
#define mp make_pair
using namespace std;
ifstream f("ubuntzei.in");
ofstream g("ubuntzei.out");
int n,m,k,i,j,conf,x,sol,y,co,c[100100][20],v[20],d[2010][2010];
bool viz[2010];
vector<pair<int,int> >l[2010];
void dijkstra(int s)
{
    int i,cost1,nod1;
    priority_queue<pair<int,int>, vector<pair<int,int> >, greater<pair<int,int> > > h;
    h.push(mp(0,s));
    for(i=0;i<n;++i)
    d[s][i]=INF;
    memset(viz,0,sizeof(viz));
    for(i=1;i<=n;++i)
    {
        nod1=h.top().second;
        cost1=h.top().first;
        h.pop();
        if(viz[nod1])
        {
            --i;
            continue;
        }
        d[s][nod1]=cost1;
        viz[nod1]=1;
        for(vector<pair<int,int > >::iterator it=l[nod1].begin(),fin=l[nod1].end();it!=fin;++it)
        {
            if(!viz[it->first])
            h.push(mp(cost1+it->second,it->first));
  //          cout<<cost1+it->nod<<' '<<it->cost<<'\n';
        }
    }
}

int main()
{
    f>>n>>m>>k;
    for(i=0;i<k;++i)
    f>>v[i],--v[i];
    for(i=1;i<=m;++i)
    {
        f>>x>>y>>co;
        l[x-1].pb(mp(y-1,co));
        l[y-1].pb(mp(x-1,co));
    }
    memset(c,INF,sizeof(c));
    dijkstra(0);
    c[0][0]=0;
    if(k==0)
    {
        g<<d[0][n-1]<<"\n";
        return 0;
    }
    for(i=0;i<k;++i)
    {
        dijkstra(v[i]);
        c[1<<i][i]=d[0][v[i]];
    }
    for(conf=1;conf<(1<<k);++conf)
    for(i=0;i<k;++i)
    if(conf&(1<<i))
    for(j=0;j<k;++j)
    if(!(conf&(1<<j)))
    {
        c[conf^(1<<j)][j]=min(c[conf^(1<<j)][j],c[conf][i]+d[v[i]][v[j]]);
    }
    sol=INF;
    for(i=0;i<k;++i)
    if(c[(1<<k)-1][i]+d[v[i]][n-1]<sol)
    sol=c[(1<<k)-1][i]+d[v[i]][n-1];
    g<<sol<<'\n';
}