标签:
高中同学让我求8个菜市场和35个销售点(他们之间还会有15个路口)之间35*8=280个组合分别的最短路径及其输出。
最短路水题,嘿嘿。能用自己学到的知识帮助别人解决问题真是极好的享受。
具体注释可以见代码,写的蛮清楚的。
#include<iostream> #include<cstdio> #include<string> #include<cstring> #include<algorithm> using namespace std; #define INF 0x3f3f3f3 //INF代表无穷大 const int MAX_N=100; int map[MAX_N][MAX_N],vis[MAX_N]; int dis[MAX_N];//dis代表到每个点的最短距离 int pre[MAX_N];//记录前驱 int ans[MAX_N];//输出路径的数组 void dijkstr(int x,int m){//x代表开始点,m代表顶点个数 for(int i=1;i<=m;i++){ dis[i]=map[x][i]; vis[i]=0; if(map[x][i]!=INF) pre[i]=x; else pre[i]=-1; } int p; vis[x]=1; for(int i=1;i<=m;i++){ int min=INF; for(int j=1;j<=m;j++){ if(!vis[j]&&dis[j]<min){ min=dis[j]; p=j; } } vis[p]=1; for(int j=1;j<=m;j++){ if(!vis[j]&&dis[p]+map[p][j]<dis[j]) { dis[j]=dis[p]+map[p][j]; pre[j]=p; } } } } int main(){ int m,n,a,b,c; //输入文件中数字含义:1-8为基地,9-43为销售点,44-58是路口,格式为 点 点 距离 freopen("in.txt","r",stdin);//从文件中读出数据 freopen("out.txt","w",stdout);//输出结果至文件 void dijkstr(int x,int n); // cout<<"请输入点的个数和边的条数"<<endl; cin>>m>>n; memset(vis,0,sizeof(vis));//m个点,n条边 for(int i=1;i<=m;i++) for(int j=1;j<=m;j++){ map[i][j]=INF; } // cout<<"请依次按照起点,终点,距离的顺序输入边"<<endl; for(int j=1;j<=n;j++){ cin>>a>>b>>c; map[a][b]=map[b][a]=c; } for(int i=1;i<=8;i++) { dijkstr(i,m); for(int j=9;j<=43;j++){ int k=j; cout<<"从基地"<<i<<"到销售点"<<(j-8)<<"的最短距离是:"<<dis[k]<<endl; int p,len=1; p=k; while(p>=1) { ans[len++]=p; p=pre[p]; } int first=0; cout<<"下面是具体路径: "<<endl; for(int r=len-1;r>=1;r--) { if(first++) cout<<"->"; if(ans[r]>=1&&ans[r]<=8) cout<<"基地"<<ans[r]; else if(ans[r]>=9&&ans[r]<=43) cout<<"销售点"<<ans[r]-8; else cout<<"路口"<<ans[r]-43; } cout<<endl; cout<<endl; } } return 0; }
out文件中的结果预览:
详细数据和源代码提供下载: http://files.cnblogs.com/files/Tach-ac/%E6%9C%80%E7%9F%AD%E8%B7%AF.rar
标签:
原文地址:http://www.cnblogs.com/Tach-ac/p/4471811.html