Pagini recente » Cod sursa (job #2707489) | Cod sursa (job #599638) | Cod sursa (job #1733912) | Cod sursa (job #304647) | Cod sursa (job #983046)
Cod sursa(job #983046)
#include <fstream>
#include <vector>
#include <queue>
#define MAXN 755
#define MAXK 20
#define INF 2000000000000000000
#define MAXCOD 33000
#define MAXC 40
using namespace std;
ifstream f("gather.in");
ofstream g("gather.out");
struct muchie{
int nod,lg,maxd;};
struct el_pq{
int nod,cod;
long long dist;};
struct Comp{
bool operator()(pair<int,long long> a,pair<int,long long> b){
return a.second>b.second;}};
struct Comp2{
bool operator()(el_pq a,el_pq b){
return a.dist>b.dist;}};
int n,m,k,a,camera[MAXK],nrd,cnt;
long long b,c;
long long dmin[MAXK][MAXK][MAXK],dst[MAXN],dist2[MAXK][MAXCOD];
bool uz[MAXK];
char s[MAXC];
muchie aux;
el_pq x;
vector<muchie> G[MAXN];
priority_queue< pair<int,long long>, vector< pair<int,long long> >, Comp> pq;
priority_queue<el_pq,vector<el_pq>,Comp2> hp;
pair<int,long long> p;
void djikstra(int a,int b);
int getnr(){
int a=0;
while(s[cnt]>='0'&&s[cnt]<='9')
a=a*10+s[cnt++]-'0';
cnt++;
return a;}
int main(){
int i,j;
f>>k>>n>>m;
for(i=0;i<k;i++)
f>>camera[i];
camera[k]=1;
f.getline(s,MAXC,'\n');
for(i=1;i<=m;i++){
cnt=0;
f.getline(s,MAXC,'\n');
a=getnr();
b=getnr();
aux.lg=getnr();
aux.maxd=getnr();
aux.nod=a;
G[b].push_back(aux);
aux.nod=b;
G[a].push_back(aux);}
for(i=0;i<=k;i++)
for(j=0;j<k;j++)
djikstra(i,j);
for(i=0;i<=k;i++)
for(j=0;j<(1<<k);j++)
dist2[i][j]=INF;
dist2[k][0]=0;
x.nod=k;
x.cod=x.dist=0;
hp.push(x);
while(1){
x=hp.top();
hp.pop();
while(x.dist!=dist2[x.nod][x.cod]){
x=hp.top();
hp.pop();}
if(x.cod==((1<<k)-1))
break;
a=x.nod;
b=x.dist;
nrd=0;
for(i=0;i<k;i++)
if(x.cod&(1<<i)){
uz[i]=1;
nrd++;}
else
uz[i]=0;
for(i=0;i<=k;i++){
if(i==a||uz[i])
continue;
if(i<k)
x.cod+=(1<<i);
c=b+dmin[a][nrd][i];
if(c<dist2[i][x.cod]){
dist2[i][x.cod]=c;
x.nod=i;
x.dist=c;
hp.push(x);}
if(i<k)
x.cod-=(1<<i);}}
g<<x.dist<<'\n';
f.close();
g.close();
return 0;}
void djikstra(int a,int b){
int i,x=camera[a];
for(i=1;i<=n;i++)
dst[i]=INF;
dst[x]=0;
pq.push(make_pair(x,0));
while(!pq.empty()){
p=pq.top();
pq.pop();
while(!pq.empty()&&p.second>dst[p.first]){
p=pq.top();
pq.pop();}
if(p.second>dst[p.first])
break;
x=p.first;
for(i=0;i<G[x].size();i++){
aux=G[x][i];
if(aux.maxd<b)
continue;
if(p.second+aux.lg*(b+1)<dst[aux.nod]){
dst[aux.nod]=p.second+aux.lg*(b+1);
pq.push(make_pair(aux.nod,dst[aux.nod]));}}}
for(i=0;i<=k;i++)
dmin[a][b][i]=dst[camera[i]];}