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];
    }
    lowc[1]=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;
}

猜你喜欢

转载自www.cnblogs.com/Fy1999/p/9456742.html