| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
dijkstra 求最短路#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int fac[12];
int n, m;
struct node{
int to, cost1, cost2, need, next;
}path[120];
int npath;
int first[11];
struct qnode{
int p, s, d;
qnode(){}
qnode(int p, int s, int d):p(p), s(s), d(d){}
bool friend operator < (qnode &a, qnode &b){
return a.d<b.d;
}
}queue[10000];
int size;
void push(qnode a){
int i=++size;
for(; i>1 && a<queue[i>>1]; i>>=1)
queue[i]=queue[i>>1];
queue[i]=a;
}
qnode pop(){
qnode min=queue[1], last=queue[size--];
int i=1, child;
for(; (i<<1)<=size; i=child){
child=i<<1;
if(child!=size && queue[child+1]<queue[child]) child++;
if(last<queue[child]) break;
queue[i]=queue[child];
}
queue[i]=last;
return min;
}
int dist[11][1024];
int dijkstra()
{
int u, v, d, s;
qnode tmp;
memset(dist, -1, sizeof(dist));
size=0;
push(qnode(1, 1, 0));
while(size>0){
tmp=pop();
u=tmp.p; d=tmp.d; s=tmp.s;
if(dist[u][s]!=-1) continue;
if(u==n) return d;
dist[u][s]=d;
for(int i=first[u]; i!=-1; i=path[i].next){
v=path[i].to;
if(dist[v][s|fac[v]]!=-1) continue;
if(s&fac[path[i].need]) push(qnode(v, s|fac[v], d+path[i].cost1));
else push(qnode(v, s|fac[v], d+path[i].cost2));
}
}
return -1;
}
void init(){
fac[1]=1;
for(int i=2; i<=10; i++)
fac[i]=2*fac[i-1];
}
int main(){
init();
int a;
npath=0;
memset(first, -1, sizeof(first));
scanf("%d %d", &n, &m);
for(int i=0; i<m; i++){
scanf("%d %d %d %d %d", &a, &path[npath].to, &path[npath].need, &path[npath].cost1, &path[npath].cost2);
path[npath].next=first[a];
first[a]=npath++;
}
a=dijkstra();
if(a==-1) printf("impossible\n");
else printf("%d\n", a);
return 0;
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator