PKU 1847 最短路径 djistrla

已经很久没做程序题了,也已经很久没有接触c,c++。这些东西已经忘的差不多了,但为了不让自己彻底忘记掉这些宝贵的知识。今天把上大学时写的一个最短路模版翻出来看下来。我草,这代码确实够烂的,没有注释,完全的面向过程编程,复用性就更不用说了。找了一个pku的最短路径题目试了下模版的正确性,不错,一次AC通过。贴出自己那丑陋的代码,后续再对这个代码动手术。

#include<iostream> #include <stdlib.h> #define INFINITY 30000 #define LENGTH 102 using namespace std; struct { int dist[LENGTH][LENGTH]; } map; int main() { int m,i,j,a,b,cc,dc,le,num,v,v0,min,n; int dist[105][105],d[105]; int p[105][105],final[105]; while(cin>>m) { cin>>a>>b; for(i=1;i<=m;i++) for(j=1;j<=m;j++) {dist[i][j]=INFINITY;dist[j][i]=INFINITY;} for(i=1;i<=m;i++) { cin>>n; for(j=1;j <=n;j++){ cin>>cc; if(j==1){ dist[i][cc] = 0; }else{ dist[i][cc] = 1; } } } v0=a; //初始化 for(i=1;i<=m;i++) { final[i]=false;d[i]=dist[v0][i]; } d[v0]=0;final[v0]=true; for(i=1;i<m;i++) { min=INFINITY; for(j=1;j<=m;j++) if(!final[j]) if(d[j]<min) {v=j;min=d[j];} if(min != INFINITY){ final[v]=true; for(j=1;j<=m;j++) if(!final[j]&&(min+dist[v][j]<d[j])) { d[j]=min+dist[v][j]; } } } if(d[b] == INFINITY){ cout<<"-1"<<endl; }else { cout<<d[b]<<endl; } } return 0; } 

 

今天把上周写的代码,重先改了下,用了c中的结构体,让程序更好维护。重用性更强。

#include<iostream> #include <stdlib.h> #define INFINITY 30000 #define LENGTH 102 using namespace std; struct Graip{ int i,j; int dist[LENGTH][LENGTH]; int s[LENGTH]; int d[LENGTH]; int edgeNum; //起始点 int v0; //初始化 void reset(){ for(i=0;i<=edgeNum;i++) for(j=0;j<=edgeNum;j++) {dist[i][j]=INFINITY;dist[j][i]=INFINITY;} }; //最短路径 void dijkstra(){ for(i=0;i<=edgeNum;i++) { s[i]=false;d[i]=dist[v0][i]; } int min,v; d[v0]=0;s[v0]=true; for(i=1;i<edgeNum;i++) { min=INFINITY; for(j=1;j<=edgeNum;j++) if(!s[j]) if(d[j]<min) {v=j;min=d[j];} if(min != INFINITY){ s[v]=true; for(j=1;j<=edgeNum;j++) if(!s[j]&&(min+dist[v][j]<d[j])) { d[j]=min+dist[v][j]; } } } } } map; int main() { int i,j,m,a,b,cc,n; while(cin>>m) { cin>>a>>b; map.edgeNum = m; map.v0=a; map.reset(); for(i=1;i<=m;i++) { cin>>n; for(j=1;j <=n;j++){ cin>>cc; if(j==1){ map.dist[i][cc] = 0; }else{ map.dist[i][cc] = 1; } } } map.dijkstra(); if(map.d[b] == INFINITY){ cout<<"-1"<<endl; }else { cout<<map.d[b]<<endl; } } return 0; } 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值