#include <stdio.h>#include <string.h>#include <iostream>#include <algorithm>#include <vector>#include <queue>#include <stack>#include <set>#include <map>#include <string>#include <math.h>#include <stdlib.h>#include <time.h>using namespace STD;Const intn= -+5;Const intinf=1<< -;structnode{intW,t;} Edge[n][n];intN,dist[n],path[n],vis[n],worth[n];voidDijkstraintV0) {intI,j,k,wmin,tmin,u; for(i=0; i<n; i++) {DIST[I]=EDGE[V0][I].W; worth[i]=edge[v0][i].t; vis[i]=0;if(I!=v0&&edge[v0][i].w<inf) Path[i]=v0;Elsepath[i]=-1; } vis[v0]=1; dist[v0]=0; worth[v0]=0; for(i=0; i<n-1; i++) {wmin=tmin=inf; U=v0; for(j=0; j<n; J + +) {if(!vis[j]&&dist[j]<=wmin) {if(dist[j]==wmin) {if(worth[j]<tmin) {u=j; WMIN=DIST[J]; TMIN=WORTH[J]; } }Else{u=j; WMIN=DIST[J]; TMIN=WORTH[J]; }}} vis[u]=1; for(k=0; k<n; k++) {if(!vis[k]&&edge[u][k].w<inf&&dist[u]+edge[u][k].w<=dist[k]) {if(Dist[u]+edge[u][k].w==dist[k]) {if(Worth[u]+edge[u][k].t<worth[k]) {DIST[K]=DIST[U]+EDGE[U][K].W; Path[k]=u; worth[k]=worth[u]+edge[u][k].t; } }Else{DIST[K]=DIST[U]+EDGE[U][K].W; Path[k]=u; worth[k]=worth[u]+edge[u][k].t; } } } }}intMain () {intI,j,k,m,s,d,u,v,w,t; while(~scanf("%d%d%d%d", &n,&m,&s,&d)) {memset(Edge,0,sizeof(Edge)); for(i=0; i<m; i++) {scanf("%d%d%d%d", &u,&v,&w,&t); Edge[u][v].w=edge[v][u].w=w; edge[u][v].t=edge[v][u].t=t; } for(i=0; i<n; i++) for(j=0; j<n; J + +) {if(I==J) edge[i][j].w=0;Else if(edge[i][j].w==0) Edge[i][j].w=inf; } Dijkstra (s);printf("%d%d\n", Dist[d],worth[d]); }return 0;}
07-Figure 5. Tourism Planning (25)