高中同学让我求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;
}
详细数据和源代码提供下载: http://files.cnblogs.com/files/Tach-ac/%E6%9C%80%E7%9F%AD%E8%B7%AF.rar