07-图5. 旅游规划(25)
2015-05-09 16:47
190 查看
#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 int N=500+5; const int inf=1<<30; struct node { int w,t; } edge ; int n,dist ,path ,vis ,worth ; void dijkstra(int v0) { int i,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; else path[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; } } } } } int main() { int i,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-图5. 旅游规划(25)
- 07-图6 旅游规划(25 分)
- 07-图5. 旅游规划(25)
- 10 07 25 笔记本电脑
- Linux-25-linux基础重要命令02(L005-07)
- 3-07. 求前缀表达式的值(25) (ZJU_PAT数学)
- 07-图6 旅游规划 (25分)
- Android面试题__2013_07_25
- 07-图6 旅游规划
- 07-图6 旅游规划
- 07-图6 旅游规划 (25分)
- 06-2. 旅游规划(25)最短路径
- 图的最短路径问题-07-图6 旅游规划
- 07-2. Insert or Merge (25)
- 07-图6 旅游规划 (25分)
- Android面试题__2013_07_25
- PTA 旅游规划(25 分)
- 利用HttpModule和ResponseFilter压缩html [0评] 08-07-25 19:51
- 07-图6 旅游规划 (25分)
- 07-排序1. 排序(25)