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

通过队列的方式。

求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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值