Pagini recente » Cod sursa (job #1645531) | Cod sursa (job #1782022) | Istoria paginii runda/summer | Autumn Warm Up 2007 | Cod sursa (job #1118314)
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
#include <set>
using namespace std;
#define maxn 2005
#define inf 2000000001
vector <vector <int> > ma;
vector <pair <int,int> > muchii[maxn];
vector <int> o;
int n,m,k,ax,i,a,b,c,i1,mask;
vector <int> dijk(int start)
{
int i,now,dnow,to,dnowto;
i=now=dnow=to=dnowto=0;
set <pair <int,int> > myset;
vector <int> dist (n+1,inf);
pair <int,int> pr;
dist[start]=0;
myset.insert(make_pair(0,start));
while (!myset.empty())
{
now=(*myset.begin()).second;
dnow=(*myset.begin()).first;
for (i=0;i<int(muchii[now].size());i++)
{
to=muchii[now][i].first;
dnowto=muchii[now][i].second;
if (dnow+dnowto<dist[to])
{
pr.first=dist[to];
pr.second=to;
if (myset.find(pr)!=myset.end())
myset.erase(myset.find(pr));
pr.first=dnow+dnowto;
pr.second=to;
dist[to]=dnow+dnowto;
myset.insert(pr);
}
}
myset.erase(myset.begin());
}
vector <int> r;
for (i=0;i<o.size();i++)
r.push_back(dist[o[i]]);
return r;
}
int memo[(1<<20)][20];
int go(int mask,int now)
{
if (mask==( ( 1<<o.size() ) -1))
{
if (now==o.size()-1)
return 0;
else
return inf;
}
if (memo[mask][now]!=0)
return memo[mask][now];
int i;
int mn=inf;
for (i=0;i<o.size();i++)
if (((1<<i)&mask)==0)
mn=min(mn,go(mask+(1<<i),i)+ma[now][i]);
memo[mask][now]=mn;
return mn;
}
int main(void)
{
FILE * f;
f=fopen("ubuntzei.in","r");
ofstream g("ubuntzei.out");
fscanf(f,"%d%d",&n,&m);
fscanf(f,"%d",&k);
o.push_back(1);
for (i=0;i<k;i++)
{
fscanf(f,"%d",&ax);
o.push_back(ax);
}
o.push_back(n);
sort(o.begin(),o.end());
for (i=0;i<m;i++)
{
fscanf(f,"%d%d%d",&a,&b,&c);
muchii[a].push_back(make_pair(b,c));
muchii[b].push_back(make_pair(a,c));
}
for (i=0;i<o.size();i++)
ma.push_back(dijk(o[i]));
//for (i=0;i<o.size();i++)
//{
// for (i1=0;i1<o.size();i1++)
// cout<<ma[i][i1]<<' ';
// cout<<'\n';
//}
g<<go(1,0);
g.close();
return 0;
}