【最短路】基础

来源:互联网 发布:淘宝新手入门教程视频 编辑:程序博客网 时间:2024/05/26 09:53

用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dijkstra算法能得出最短路径的最优解,但由于它遍历计算的节点很多,所以效率低。

这里写图片描述

/*    n个点,m条边,求1 - n 的距离    输入x y z,表示x到y的距离为z     不存在输出-1 没有初始化 */#include<cstdio>#include<algorithm>#include<cstring>#include<queue>using namespace std;#define INF 0x3f3f3f3fstruct Pair{    int first,second;       //first存点,second存距离     bool friend operator < (Pair a,Pair b)    {        return a.second > b.second;    }}pr,ne;int n,m;vector<int> edge[105];      //存与之相连的边 int length[105][105];       //存相连边的长度 int dis[105];       //记录到起点的距离 void dijkstra(){    memset(dis,INF,sizeof(dis));    /*     第二个参数可以填 0,-1,1,其他     0:把元素都初始化为0    -1:初始化为-1    1:初始化为一个奇怪的值    其他:其他     */     bool vis[105];    memset(vis,false,sizeof(vis));    dis[1] = 0;    pr.first = 1;    pr.second = 0;    priority_queue<Pair> Q;    Q.push(pr);    while (!Q.empty())    {        pr = Q.top();//      printf ("==%d %d==\n",pr.first,pr.second);        Q.pop();        if (vis[pr.first])            continue;        vis[pr.first] = true;        for (int i = 0 ; i < edge[pr.first].size() ; i++)        {            ne.first = edge[pr.first][i];            ne.second = pr.second + length[pr.first][ne.first];            if (ne.second < dis[ne.first])            {                dis[ne.first] = ne.second;                Q.push(ne);            }        }    }}int main(){    scanf ("%d%d",&n,&m);    memset(length,-1,sizeof(length));    for (int i = 1 ; i <= m ; i++)    {        int x,y,z;        scanf ("%d%d%d",&x,&y,&z);        edge[x].push_back(y);        edge[y].push_back(x);       //双向存图         if (length[x][y] == -1)            length[x][y] = length[y][x] = z;        else            length[x][y] = length[y][x] = min(z,length[x][y]);    }    dijkstra();    printf ("%d\n",dis[n] == INF ? -1 : dis[n]);    return 0;}/*测试数据7 101 3 31 4 13 4 12 3 53 5 54 5 23 6 25 6 15 7 76 7 4*/