• hdu2544 最短路(最短路模板题)


    题目链接:https://vjudge.net/problem/HDU-2544#author=0

    Dijkstra算法:(类似prim算法)

    #include <iostream>
    #include <cstring>
    
    using namespace std;
    
    const int maxn=1010;
    const int INF=0x3f3f3f3f;
    
    int lowc[maxn],cost[maxn][maxn];
    bool vis[maxn];
    int n,m;
    
    void Dijkstra()
    {
        for(int i=2;i<=n;i++)
        {
            lowc[i]=cost[1][i];//inf
        }
        lowc[1]=0;//自身到自身为0
        for(int i=1;i<=n;i++)
        {
            int k=-1;
            for(int j=1;j<=n;j++)
            {
                if(!vis[j]&&(k==-1||lowc[j]<lowc[k]))//第一个数或者
                {
                    k=j;//距离最近的顶点
                }
            }
            if(k==-1) break;//所有顶点已经遍历完毕
            vis[k]=1;
            for(int j=1;j<=n;j++)
            {
                if(!vis[j]) lowc[j]=min(lowc[j],lowc[k]+cost[k][j]);
            }
        }
        cout<<lowc[n]<<endl;
    }
    
    void init()
    {
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                if(i==j) cost[i][j]=0;
                else cost[i][j]=INF;
            }
        }
    }
    
    int main()
    {
        ios::sync_with_stdio(false);cin.tie(0);
        while(cin>>n>>m&&(n||m))
        {
            memset(vis,0,sizeof(vis));
            int u,v,w;
            init();
            for(int i=0;i<m;i++)
            {
                cin>>u>>v>>w;
                cost[u][v]=w;
                cost[v][u]=w;
            }
            Dijkstra();
    
        }
    
        return 0;
    }

     floyd算法(类似于dp):

    void floyd()
    {
        for(int k=1;k<=n;k++)
            for(int i=1;i<=n;i++)
                for(int j=1;j<=n;j++)
                    cost[i][j]=min(cost[i][j],cost[i][k]+cost[k][j]);
    
        cout<<cost[1][n]<<endl;
    }

     SPFA算法:

    void SPFA()
    {
        queue<int>q;
        for(int i=1;i<=n;i++)
        {
            lowc[i]=INF;
        }
        lowc[1]=0;
        vis[1]=1;
        q.push(1);
        while(!q.empty())
        {
            int now=q.front();
            q.pop();
            vis[now]=0;
            for(int i=1;i<=n;i++)
            {
                if(lowc[now]+cost[now][i]<lowc[i])
                {
                    lowc[i]=lowc[now]+cost[now][i];
                    if(!vis[i])
                    {
                        vis[i]=1;
                        q.push(i);
                    }
                }
            }
        }
        cout<<lowc[n]<<endl;
    }
    
  • 相关阅读:
    mysql中的where和having的区别
    php解决前后端验证字符串长度不一致
    复习
    SQL语句执行顺序
    领域驱动设计(DDD)
    什么是ORM?为啥要是用ORM?
    Python web框架搭建
    Python web自动化环境搭建
    Jmeter录制手机app脚本
    Charles截取 Https 通讯信息
  • 原文地址:https://www.cnblogs.com/Fy1999/p/9456742.html
Copyright © 2020-2023  润新知