水题堆2.G - 一个人的旅行 (dijkstra算法
2018-02-14 22:36
281 查看
#include <stdio.h> #include <stdlib.h> #define MAX 1001 #define INF 1000000 int s[1001],d[1001],cost[1001][1001],u[1001],answer[1001],use[1001],t,T,S,D,n; int min(int a,int b) { return a<b?a:b; } int max(int a,int b) { return a>b?a:b; } void f(int n,int cost[1001][1001]) { int i; for(i=0;i<=1000;i++){//Ö÷Ìå u[i]=INF; } memset(use,0,sizeof(use)); for(i=0;i<=n;i++){ u[i]=cost[0][i]; // printf("%d,\n",u[i]); //printf("%d,,\n",n); } u[0]=0; //use[0]=1; while(1){ int x=-1,y; for(y=1;y<=n;y++){ if(!use[y]&&(x==-1||u[y]<u[x]))x=y; } if(x==-1)break; use[x]=1; for(y=1;y<=n;y++){ u[y]=min(u[y],u[x]+cost[x][y]); //printf("%d,,\n",u[y]); } } int ans=INF; for(i=0;i<=D-1;i++){ ans=min(ans,u[d[i]]);//之前写成了1--D所以出来的答案是零 // printf("%d\n",d[i]); } printf("%d\n",ans); } int main() { int i,j,a,b; while(scanf("%d%d%d",&T,&S,&D)!=EOF){ for(i=0;i<=1000;i++){ for(j=0;j<=1000;j++){ cost[i][j]=INF; } cost[i][i]=0; } int n=0; for(i=1;i<=T;i++){ scanf("%d%d%d",&a,&b,&t); n=max(max(n,a),b); cost[a][b]=cost[b][a]=t; //n=max(n,max(a,b)); } //printf("%d,,",n); for(i=0;i<S;i++){ scanf("%d",&s[i]); cost[0][s[i]]=cost[s[i]][0]=0; } for(i=0;i<D;i++)scanf("%d",&d[i]); f(n,cost); } return 0; }先初始化起点与其余各点之间的距离,若无直接的联系先初始化为无穷大。
寻找与起点距离最近的点j并标记,将原本的距离d[i]与d[j]+cost[j][i]比较取最小值,在遍历所有点后,再次寻找下一个未被标记过的点,重复这个过程
相关文章推荐
- HDUOJ 2066 一个人的旅行(dijkstra算法)
- 一个人的旅行(杭电oj2066)(Dijkstra算法)
- (阶段三 dijkstra算法温习1.2)HDU 2066 一个人的旅行(使用dijkstra来解决多源起点和多源终点的最短路径问题)
- HDU:2066 一个人的旅行(dijkstra算法求最短路径)
- 一个人的旅行(Dijkstra算法)
- hdu2112 一个人的旅行 最短路问题,dijkstra算法
- HDU 2066 一个人的旅行 (最短路--Dijkstra算法)
- HDU2066 一个人的旅行(dijkstra算法)
- 最短路算法 Dijkstra算法 HDU 2066 一个人的旅行
- hdu 2066一个人的旅行 Dijkstra算法应用
- 一个人的旅行(用小技巧转化为dijkstra算法)
- hdu 2066 一个人的旅行 (Dijkstra算法)
- HDU 2066 单源最短路径(Dijkstra算法) 一个人的旅行
- Hdu 2066 一个人的旅行(dijkstra算法)
- 一个人的旅行(Dijkstra算法)
- HDOJ 2066 一个人的旅行(最短路,dijkstra算法)
- HDU 2066 一个人的旅行(Dijkstra算法)
- 一个人的旅行 HDU杭电2066【dijkstra算法 || SPFA】
- HDU——2066一个人的旅行(优先队列SPFA水题)
- HDU 2066 一个人的旅行 (Dijkstra算法)