我是靠谱客的博主 怡然季节,最近开发中收集的这篇文章主要介绍hdu 2544 最短路(Floyd || dijkstra || spfa )模板,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

#include <stdio.h>  
#include <algorithm>  
#include <stdlib.h>  
#include <string.h>  
#include <iostream>  
#include <queue>  
  
using namespace std;  
  
typedef long long LL;  
  
const int N = 1000;  
const int INF = 0x3f3f3f3f;  
  
int dis[N], G[N][N], n, s;  
bool vis[N];  
  
void dijkstra()  
{  
    for(int i = 1; i <= n; i++)  
        dis[i] = G[1][i];//代表起点到各个节点的距离  
    dis[1] = 0;  
    for(int i = 1; i <= n; i++)//这里也可以事先标记起点已访问,然后遍历n-1个节点,找到离1号顶点最近的顶点
    {  
        int k = -1;  
        for(int j = 1; j <= n; j++)  
        {  
            if(!vis[j] && (k==-1 || dis[j]<dis[k]))  
                k = j;  
        }  
        if(k == -1) break;//已经遍历所有的点  
        vis[k] = true;  
        for(int j = 1; j <= n; j++)  
        {  
            if(!vis[j]) dis[j] = min(dis[j], dis[k]+G[k][j]);  
        }  
    }  
    printf("%dn", dis[n]);  
}  
  
void floyd()  
{  
    for(int k = 1; k <= n; k++)  
        for(int i = 1; i <= n; i++)  
            for(int j = 1; j <= n; j++)  
                G[i][j] = min(G[i][j], G[i][k]+G[k][j]);  
    printf("%dn", G[1][n]);  
}  
  
void spfa()  
{  
    queue<int>que;  
    for(int i = 1; i <= n; i++)  
        dis[i] = INF;//初值记得赋无穷,而不是G数组中的值!  
    dis[1] = 0;  
    vis[1] = true;  
    que.push(1);  
    while(!que.empty())  
    {  
        int now = que.front();  
        que.pop();  
        vis[now] = false;//记得还原!!  
        for(int i = 1; i <= n; i++)  
        {  
            if(dis[now]+G[now][i]<dis[i])  
            {  
                dis[i] = dis[now]+G[now][i];  
                if(!vis[i])  
                {  
                    vis[i] = true;  
                    que.push(i);  
                }  
            }  
        }  
    }  
    printf("%dn", dis[n]);  
}  
  
int main()  
{  
   // freopen("in.txt", "r", stdin);  
    int m, e, w;  
    while(~scanf("%d%d", &n, &m) &&(n+m))  
    {   
        memset(vis, 0, sizeof(vis));  
        for(int i = 1; i <= n; i++)  
            for(int j = 1; j <= n; j++)  
            {  
                if(i == j) G[i][j] = 0;  
                else G[i][j] = INF;  
            }  
        for(int i = 1; i <= m; i++)  
        {  
            scanf("%d%d%d", &s, &e, &w);  
            G[s][e] = G[e][s] = w;  
        }  
      //  dijkstra();  
     // floyd();  
        spfa();  
    }  
    return 0;  
}  

最后

以上就是怡然季节为你收集整理的hdu 2544 最短路(Floyd || dijkstra || spfa )模板的全部内容,希望文章能够帮你解决hdu 2544 最短路(Floyd || dijkstra || spfa )模板所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(48)

评论列表共有 0 条评论

立即
投稿
返回
顶部