首页 > 代码库 > 算法笔记--最短路算法

算法笔记--最短路算法

1.单源最短路问题

①Dijkstra算法:

普通版:

 

技术分享
#define mem(a,b) memset((a),(b),sizeof(a))
const int INF=0x3f3f3f3f;
const int N=105;
int g[N][N];
int d[N];
bool vis[N];
int n,m;

void Dijkstra(int s)
{
    mem(d,INF);
    mem(vis,false);
    d[s]=0;
    
    while(true)
    {
        int v=-1;
        for(int i=1;i<=n;i++)
        if(!vis[i]&&(v==-1||d[i]<d[v]))v=i;
        
        if(v==-1)break;
        vis[v]=true;
        
        for(int i=1;i<=n;i++)
        {
            d[i]=min(d[i],d[v]+g[v][i]);
        }
    }
}
View Code

 

例题:hdu2544最短路

代码:

 

技术分享
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ls rt<<1,l,m
#define rs rt<<1|1,m+1,r
#define pb push_back
#define mem(a,b) memset((a),(b),sizeof(a))
const int INF=0x3f3f3f3f;
const int N=105;
int g[N][N];
int d[N];
bool vis[N];
int n,m;

void Dijkstra(int s)
{
    mem(d,INF);
    mem(vis,false);
    d[s]=0;
    
    while(true)
    {
        int v=-1;
        for(int i=1;i<=n;i++)
        if(!vis[i]&&(v==-1||d[i]<d[v]))v=i;
        
        if(v==-1)break;
        vis[v]=true;
        
        for(int i=1;i<=n;i++)
        {
            d[i]=min(d[i],d[v]+g[v][i]);
        }
    }
}
int main()
{
    while(~scanf("%d%d",&n,&m)&&n&&m)
    {
        mem(g,INF);
        for(int i=0;i<m;i++)
        {
            int a,b,c;
            cin>>a>>b>>c;
            g[a][b]=c;
            g[b][a]=c;
        }
        Dijkstra(1);
        printf("%d\n",d[n]);
    }
    return 0;
} 
View Code

 

未完待续。。。

 

算法笔记--最短路算法