已经很久没做程序题了,也已经很久没有接触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; }