Cod sursa(job #1362895)

Utilizator StefanMudragMudrag Stefan StefanMudrag Data 26 februarie 2015 16:27:11
Problema Ubuntzei Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.87 kb
#include<iostream>
#include<fstream>
#include<vector>
#include<queue>
#define NMAX 2001
#define KMAX 16
#define PMAX 1<<15
#define f first
#define s second
#define INF 1000000
#include<utility>
#include<cstring>
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
int n,m,k,vfmin;
vector<pair<int,int> >g[NMAX];
int  dmn[KMAX][KMAX], bst[PMAX][KMAX],dmin[NMAX];
int ct[KMAX],pas;
class comparvf
{
public:
    bool operator() (const int & x,const int &y)
    {
        return dmin[x]<dmin[y];
    }
};
priority_queue<int,vector<int>,comparvf> h;
void read()
{   int x,y,c;
    fin>>n>>m>>k;
    ct[0]=1;
    for(int i=1;i<=k;i++)
       fin>>ct[i];
 ct[k+1]=n;k=k+2;
    for(int i=1;i<=m;i++)
    {
        fin>>x>>y>>c;
        g[x].push_back(make_pair(y,c));
        g[y].push_back(make_pair(x,c));
    }

    fin.close();
}
void dijkstra(int i)
{   int cr=0;
    pas=i; memset(dmin,INF,sizeof(dmin));
    h.push(i);dmin[pas]=0;
    while(!h.empty())
    {  cr++;
        vfmin=h.top();h.pop();//cout<<vfmin<<'\n';
        for(int x=0;x<g[vfmin].size();++x)
        {
            if(dmin[g[vfmin][x].f]>dmin[vfmin]+g[vfmin][x].s)
            {
                dmin[g[vfmin][x].f]=dmin[vfmin]+g[vfmin][x].s;
                h.push(g[vfmin][x].f);
            }
        }
    }
}
void solve()
{  int cr=0;
  memset(bst,INF,sizeof(bst));
  bst[1][0]=0;
    for(int i=1;i<(1<<k);i++)
       for(int j=0;j<k;j++)
          if(i&(1<<j))
        for(int p=0;p<k;p++)

              if(i & (1<<p))
       {
         bst[i][j]=min(bst[i][j],bst[i^(1<<j)][p]+dmn[p][j]);

       }

fout<<bst[(1<<k)-1][k-1];
}
int main()
{
    read();



  for(int i=0;i<k;i++)
    {dijkstra(ct[i]);
    for(int j=0;j<k;++j)
     dmn[i][j]=dmin[ct[j]];
    dmn[i][i]=0;

  }
  solve();
 fout.close();

    return 0;
}