hdoj-3970-最短路径问题

来源:互联网 发布:淘宝插件 编辑:程序博客网 时间:2024/06/04 23:19

最短路径问题

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 15293    Accepted Submission(s): 4626


Problem Description
给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的。
 

Input
输入n,m,点的编号是1~n,然后是m行,每行4个数 a,b,d,p,表示a和b之间有一条边,且其长度为d,花费为p。最后一行是两个数 s,t;起点s,终点。n和m为0时输入结束。
(1<n<=1000, 0<m<100000, s != t)
 

Output
输出 一行有两个数, 最短距离及其花费。
 

Sample Input
3 21 2 5 62 3 4 51 30 0
 

Sample Output
9 11
 

Source
浙大计算机研究生复试上机考试-2010年  

#include<stdio.h>#include<string.h>const int maxint=0xfffffff;const int N=1000+10;int map[1001][1001],cost[1001][1001];int min_dis,min_cost;void dijkstra(int s,int  t,int n){int i,j,k,p,min;static bool visit[N];int dis[N],cost1[N];memset(visit,0,sizeof(visit));for(i=1;i<=N;++i){dis[i]=map[s][i];cost1[i]=cost[s][i];}dis[s]=0;visit[s]=true;for(k=1;k<n;++k){for(min=maxint,i=1;i<=n;++i){if(!visit[i]&&dis[i]<min) p=i,min=dis[i];}if(min>=maxint) break;for(visit[p]=1,i=1;i<=n;++i)  if(!visit[i]&&map[p][i]>=0){  if(min+map[p][i]<dis[i])    dis[i]=min+map[p][i],cost1[i]=cost[p][i]+cost1[p];//path[i]=p;else if(dis[i]==min+map[p][i]&&cost1[i]>cost[p][i]+cost1[p])  cost1[i]=cost[p][i]+cost1[p];   }if(visit[t]){min_dis=dis[t];min_cost=cost1[t];return ;}}}int main(){int n,m,i,j,a,b,d,p,s,t;while(~scanf("%d%d",&n,&m),n||m){for(i=1;i<=n;++i)  for(j=1;j<=i;++j){  map[i][j]=map[j][i]=maxint;  cost[i][j]=cost[j][i]=maxint;  }for(i=1;i<=m;++i){scanf("%d%d%d%d",&a,&b,&d,&p);if(map[a][b]>d)   //最开始没有判断 map[a][b] 与 d 的大小,而把d直接赋值给  map[a][b] 了,导致wrong !!!!!!map[a][b]=map[b][a]=d,cost[a][b]=cost[b][a]=p;}scanf("%d%d",&s,&t);dijkstra(s,t,n);printf("%d %d\n",min_dis,min_cost);}return 0;}


0 0
原创粉丝点击