poj2387-最短路-dijkstra

原题连接

题意

给定n个点以及m条无向边,
求第n点到第一个点的最小距离
纯粹的迪杰斯特拉模板题

思路

迪杰斯特拉:在所有的路都是正数情况下,找从n点开始到达其他点的最短距离
首先从n点开始,把能到达的点全部存储在dist中
每一次从dist中找出一个最小值,
这个最小值表示当前n点能到达的最近的点
在这个点走向其他点,检验能否通过这个最小点减小到其他点的距离

注意,可能a,b之间存在多条边,需要存一个最小的路径

#include 
#include 
#include 
#include 
using namespace std;

const int N=1100;

int map[N][N];//存储路径的长度,路是双向的
int dist[N];//dist[i]表示从第n点到第i点的最短距离 
int t,n; 
int flag[N];//标记,标记哪些点已经是找到最短距离了 

int find()
{
    int i,j,l;
    //将到达其他点的最短路径初始化 
    for(i=1;i<=n;i++) dist[i]=map[n][i];
    dist[n]=0;//n点到达n点的距离是0;
    flag[n]=1; 
    
    //一共需要找n-1个点的最短距离 
    for(l=1;ldist[i]){
                //则将k赋值,表示找到的最小的点 
                k=i;
                maxv=dist[i];
            } 
        } 
        
        //如果k==-1.则表示找了一圈,已经没有符合条件的最短的路了 
        if(k==-1){
            break;//直接退出 
        } 
        
        flag[k]=1;//找到的最短路标记一下 
        for(i=1;i<=n;i++){
            if(!flag[i] && maxv+map[k][i]

你可能感兴趣的:(poj2387-最短路-dijkstra)