Pagini recente » Cod sursa (job #2788837) | Cod sursa (job #1707161) | Cod sursa (job #57303) | Cod sursa (job #2953324) | Cod sursa (job #2538806)
//#include <iostream>
#include <vector>
#include <queue>
#include <fstream>
using namespace std;
int d[800][35000],put[20];
int graf[800];
ifstream cin("gather.in");
ofstream cout("gather.out");
struct edge{
int a,b;
int cap,dist;
}x,y;
priority_queue <pair<int,pair<int,pair<int,int> > > > q;
vector<edge> legit[800];
bool apare(int stare,int bit){
if(bit==-1)
return true;
if(bit==0){
if(stare%2==1){
return true;
}
return false;
}
if((stare/put[bit]*put[bit])%put[bit+1]==0){
return false;
}
return true;
}
int trans(int stare,int bit){
stare+=put[bit];
return stare;
}
int main()
{
int k,n,m,a,b,dist,cap;
cin>>k>>n>>m;
for(int i=0;i<=760;i++)
graf[i]=-1;
for(int i=1;i<=k;i++){
cin>>a;
graf[a]=i-1;
}
for(int i=1;i<=m;i++){
cin>>a>>b>>dist>>cap;
x.a=a;
x.b=b;
x.dist=dist;
x.cap=cap;
y.a=b;
y.b=a;
y.dist=dist;
y.cap=cap;
legit[a].push_back(x);
legit[b].push_back(y);
}
put[0]=1;
for(int i=1;i<=16;i++){
put[i]=put[i-1]*2;
}
q.push(make_pair(0,make_pair(1,make_pair(0,0))));
while(q.empty()==false){
int dist=q.top().first;
int nod=q.top().second.first;
int stare=q.top().second.second.first;
int pers=q.top().second.second.second;
q.pop();
if(d[nod][stare]==1){
continue;
}
d[nod][stare]=1;
if(pers==k){
cout<<-dist;
return 0;
}
if(pers==k-1 and graf[nod]!=-1){
if(apare(stare,graf[nod]==false)){
cout<<-dist;
return 0;
}
}
if(graf[nod]!=-1){
apare(stare,graf[nod]);
}
if(graf[nod]!=-1 and apare(stare,graf[nod])==false){
int stt=trans(stare,graf[nod]);
int pp=pers+1;
for(int j=0;j<legit[nod].size();j++){
if(legit[nod][j].cap>=pp){
q.push(make_pair(dist-legit[nod][j].dist*(pp+1),make_pair(legit[nod][j].b,make_pair(stt,pp))));
}
}
}
//cout<<"GIGEL2\n";
for(int j=0;j<legit[nod].size();j++){
if(legit[nod][j].cap>=pers){
q.push(make_pair(dist-legit[nod][j].dist*(pers+1),make_pair(legit[nod][j].b,make_pair(stare,pers))));
}
}
}
return 0;
}
/**
buna casian patrascanu
*/