最短路。给一n个点m条边的图,每条边带权,找出这个图从点1至点n的一条路
#include <iostream>
using namespace std;
int a[10][10],al[10][10],num[10]; //a[i][j]记连接点i的点,al[][]记边长,num[i]记与点i相连的点的数量。
int len[10],link[10],s[10],sn,n,m; //s[]记录已找到到起点的最短距离的点。
void read(){
int i,j,k,l;
cin>>n>>m;
for(i=1;i<=m;i++){
cin>>j>>k>>l;
num[j]++;
a[j][num[j]]=k;
al[j][num[j]]=l;
num[k]++;
a[k][num[k]]=j;
al[k][num[k]]=l;
}
for(i=1;i<=n;i++){
for(j=1;j<=num[i];j++) cout<<a[i][j]<<" "<<al[i][j]<<" ";
cout<<endl;
}
}
int p,q,ln;
void find(){
int i,j,k,d;
ln=999;p=0;
for(i=1;i<=sn;i++){
for(j=1;j<=num[s[i]];j++){
d=a[s[i]][j];
k=sn;
while(k>0&&s[k]!=d) k--;
if(k==0)
if(len[s[i]]+al[s[i]][j]<ln){
ln=len[s[i]]+al[s[i]][j];
p=s[i];q=d;
}
}
}
}
int main(){
int i;
read();
for(i=1;i<=n;i++){
len[i]=999;link[i]=0;
}
len[1]=0;sn=1;s[1]=1;
p=1;
while(p!=0){
find();
if(p>0){
sn++;s[sn]=q;
len[q]=ln;
link[q]=p;
}
}
for(i=1;i<=n;i++) cout<<len[i]<<" ";
}
算法:
<一>、将图存入邻接表a[][]
<二>、设集合点集合s={1};len[i]记第i点到点1的已发现的最短路长度。初始设len[i]为极大值,len[1]=1;
p=1
当p>0重复
1) 在s[]中找一点p,再找一点q,q不要在s[]中,要经过边(p,q)到达q的距离最小,记为ln,如果找不到则p设为0
2) 如果p>0则
将q加入s中,len[q]=ln。
<三>、输出len[]
可设数组link[],link[q]=p;则最后可跟着link[]输出最短的路。