通过队列的方式。
求10-1的距离
先把到1的距离变为0
然后一个个找离1近的点 f[2]=14 f[3]=2 f[4]=1
然后找分别离他们近的点 f[5]=f[2]+1 f[6]=f[2]+3 f[6]之前的f[6]小 则 f[6]=f[3]+3 f[10]=f[4]+89
然后从被新添加的开始 f[5] f[6] f[10]开始 然后从6到2发现 更小 那么f[2]更新,则f[2]开始到各个点的距离又开始重新计算,最终得出1到各个点的最短距离
输入样例:
11 14
1 2 14
1 3 2
1 4 1
2 5 1
2 6 1
3 6 3
4 10 89
5 8 6
6 7 55
7 10 6
8 9 7
7 11 4
8 11 1
11 10 2
#include <iostream>
#include <string.h>
#include <queue>
#define maxn 9999
using namespace std;
int main(){
int n,n1,n2,x,a=0;
cin >> n >> n1; //n表示有n个点,从n1到n2的距离
int map[n+1][n+1];
int f[n+1],c[n+1];
memset(c,0,sizeof(c));
int t1=1,t2=1,t3=1,i,j;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
map[i][j]=-1;
for(i=0;i<n1;i++){
cin >> t1 >> t2 >> t3;
map[t1][t2]=t3;
map[t2][t1]=t3;
}
for(i=1;i<=n;i++)
f[i]=maxn;
f[1]=0;
queue<int>qq;
qq.push(1);
while(!qq.empty()){
j=qq.front();
qq.pop();
for(i=1;i<=n;i++){
//cout << a++;
if(map[i][j]!=-1&&f[j]!=maxn&&map[i][j]+f[j]<f[i]){
f[i]=f[j]+map[i][j];
qq.push(i);
}
}
}
cout << f[10];
//int sum=0;
// for(i=1;i<=n;i++)
// sum+=c[i];
// cout << sum <<endl;
/*x=n1;
while(x){
printf("%d",x);
x=c[x];
}*/return 0;
}