单源最短路径<队列><可以返回再找>

来源:互联网 发布:linux android 模拟器 编辑:程序博客网 时间:2024/04/27 04:08

通过队列的方式。

求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;  }  


0 0
原创粉丝点击