| ||||||||||
| 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 | |||||||||
Re:dijkstra 求最短路In Reply To:dijkstra 求最短路 Posted by:stupidjohn at 2011-05-11 09:14:12 > #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