Pagini recente » Cod sursa (job #729870) | Cod sursa (job #2157394) | Cod sursa (job #545474) | Cod sursa (job #1414215) | Cod sursa (job #701375)
Cod sursa(job #701375)
#include <fstream>
#include <cstring>
#include <queue>
#include <climits>
using namespace std;
ifstream f("ubuntzei.in");
ofstream g("ubuntzei.out");
struct node
{
int nr,c;
node *next;
} *v[2012],*p;
int n,m,k,d[18][18],pr[18],a,b,cq,cul[2012],cost[2012],smin,prb[18];
char prez[18];
queue <int> q;
void dijkstra(int s)
{
int w;
memset(cul,0,sizeof(cul));
memset(cost,0,sizeof(cost));
q.push(s);
while(!q.empty())
{
w=q.front();
q.pop();
cul[w]=2;
p=v[w];
while(p)
{
if(!cul[p->nr] || (cul[p->nr]==2&&cost[p->nr]>cost[w]+p->c) )
{
cul[p->nr]=1;
q.push(p->nr);
cost[p->nr]=cost[w]+p->c;
}
else if(cost[p->nr]>cost[w]+p->c) cost[p->nr]=cost[w]+p->c;
p=p->next;
}
}
//g<<s<<'\n';
//for(int i=1;i<=n;++i) g<<cost[i]<<' ';
//g<<"\n\n";
}
void back(int u, int sc)
{
int i;
if(u==k+1)
{
smin=(smin<sc+d[prb[k]][k+1])?smin:sc+d[prb[k]][k+1];
return;
}
for(i=1;i<=k;++i)
{
prb[u]=i;
if(!prez[i])
{
prez[i]=1;
//sc+=d[prb[u-1]][i];
if(sc+d[prb[u-1]][i]<=smin) back(u+1,sc+d[prb[u-1]][i]);
prez[i]=0;
}
}
}
int main()
{
int i,j;
f>>n>>m>>k;
for(i=1;i<=k;++i) f>>pr[i];
for(i=1;i<=m;++i)
{
f>>a>>b>>cq;
p=new node;
p->nr=b;
p->c=cq;
p->next=v[a];
v[a]=p;
p=new node;
p->nr=a;
p->c=cq;
p->next=v[b];
v[b]=p;
}
smin=INT_MAX;
if(!k) dijkstra(1), g<<cost[n]<<'\n';
else
{
for(i=1;i<=k;++i)
{
dijkstra(pr[i]);
for(j=1;j<i;++j) d[i][j]=d[j][i]=cost[pr[j]];
d[0][i]=cost[1];
d[i][k+1]=cost[n];
}
prb[0]=0;
back(1,0);
g<<smin<<'\n';
}
/*for(i=0;i<=k+1;++i)
{
for(j=0;j<=k+1;++j) g<<d[i][j]<<' ';
g<<'\n';
}*/
f.close(); g.close();
return 0;
}