Pagini recente » Cod sursa (job #272711) | Cod sursa (job #2510528) | Cod sursa (job #2886188) | Cod sursa (job #479200) | Cod sursa (job #799266)
Cod sursa(job #799266)
#include<fstream>
#include<queue>
#include<vector>
#include<cmath>
using namespace std;
int n,m,K,cel[20];
struct Muchie{int x,y,maxim; long long lg;};
Muchie M[1300];
vector <int> G[760];
struct Configuratie{int conf,x;};
queue <Configuratie> Q;
long long dist[20][20][760],nr[33000],sol=10000000000LL,best[33000][20],dist1[760];
int detinut[760];
inline void Citire()
{
int i;
ifstream fin("gather.in");
fin>>K>>n>>m;
for(i=0;i<K;i++)
{
fin>>cel[i];
detinut[cel[i]]=i+1;
}
for(i=1;i<=m;i++)
{
fin>>M[i].x>>M[i].y>>M[i].lg>>M[i].maxim;
G[M[i].x].push_back(i);
G[M[i].y].push_back(i);
}
fin.close();
}
inline void NumarBiti()
{
int i,x;
for(i=1;i<(1<<K);i++)
{
x=i;
while(x)
{
if(x%2==1)
nr[i]+=1LL;
x/=2;
}
}
}
inline void BellmanFord(int start,int D,long long dist[])
{
queue <int> Q;
while(!Q.empty())
Q.pop();
int i,x,nod;
vector <int>::iterator it;
for(i=1;i<=n;i++)
dist[i]=10000000000LL;
dist[start]=0LL;
Q.push(start);
while(!Q.empty())
{
x=Q.front();
Q.pop();
for(it=G[x].begin();it!=G[x].end();it++)
{
nod=M[*it].x+M[*it].y-x;
if(M[*it].maxim>=D && dist[nod]>dist[x]+M[*it].lg)
{
dist[nod]=dist[x]+M[*it].lg;
if(!detinut[nod])
Q.push(nod);
}
}
}
}
inline void BellmanFord1()
{
queue <int> Q;
while(!Q.empty())
Q.pop();
int i,x,d,nod,d2;
vector <int>::iterator it;
for(i=1;i<=n;i++)
dist1[i]=10000000000LL;
dist1[1]=0LL;
if(!detinut[1])
Q.push(1);
while(!Q.empty())
{
x=Q.front();
Q.pop();
for(it=G[x].begin();it!=G[x].end();it++)
{
nod=M[*it].x+M[*it].y-x;
if(detinut[nod])
d2=d+1;
else
d2=d;
if(dist1[nod]>dist1[x]+M[*it].lg)
{
dist1[nod]=dist1[x]+M[*it].lg;
if(!detinut[nod])
Q.push(nod);
}
}
}
}
inline void Distante()
{
int i,j;
for(i=0;i<K;i++)
for(j=1;j<K;j++)
BellmanFord(cel[i],j,dist[i][j]);
BellmanFord1();
}
inline void Rezolvare()
{
int i,j,conf;
for(conf=0;conf<(1<<K);conf++)
for(i=0;i<K;i++)
best[conf][i]=10000000000LL;
for(i=0;i<K;i++)
{
conf=(1<<i);
best[conf][i]=dist1[cel[i]];
}
for(conf=3;conf<(1<<K);conf++)
{
for(i=0;i<K;i++)
{
if((conf&(1<<i))==0)
continue;
for(j=0;j<K;j++)
{
if((conf&(1<<j))==0 || j==i || best[conf-(1<<i)][j]==10000000000LL || dist[j][nr[conf-(1<<i)]][cel[i]]==10000000000LL)
continue;
best[conf][i]=min(best[conf][i],best[conf-(1<<i)][j]+(nr[conf-(1<<i)]+1LL)*dist[j][nr[conf-(1<<i)]][cel[i]]);
}
}
}
for(i=0;i<K;i++)
sol=min(sol,best[(1<<K)-1][i]);
}
inline void Afisare()
{
ofstream fout("gather.out");
fout<<sol<<"\n";
fout.close();
}
int main()
{
Citire();
NumarBiti();
Distante();
Rezolvare();
Afisare();
return 0;
}