`
Coco_young
  • 浏览: 126497 次
  • 性别: Icon_minigender_1
  • 来自: 湖南长沙
社区版块
存档分类
最新评论

几个最短路算法。

阅读更多
http://acm.hdu.edu.cn/showproblem.php?pid=2544
大水题一枚,仅以练手。
Dijkstra:
#include<iostream>
using namespace std;
#define SIZE 200
#define INF 0xfffffff
#define MIN(a,b) a>b?b:a
int G[SIZE][SIZE];
int d[SIZE];
int vis[SIZE];
int N,M;
int minV()
{
    int i,v;
    for(i=0;i<N;i++)
    {
       if(!vis[i])
       {
          v = i;
          break;
       }
    }
    for(;i<N;i++)
    if(!vis[i]&&d[v]>d[i])
    v = i;
    return v;
}
int Dijkstra(int s)
{
    memset(vis,0,sizeof(vis));
    for(int i=0;i<N;i++)d[i]=INF;
    d[s] = 0;
    for(int i=0;i<N;i++)
    {
       int v = minV();
       vis[v] = true;
       for(int u=0;u<N;u++)
       {
          if(G[v][u])
          {
            d[u] = MIN(d[u],d[v]+G[v][u]);
          }
       }
    }
    return d[N-1];
}
int main()
{
    while(cin>>N>>M,N||M)
    {
       for(int i=0;i<N;i++)
       for(int j=0;j<N;j++)
       G[i][j] = INF;
       int a,b;
       for(int i=0;i<M;i++)
       {
          int c;
          cin>>a>>b>>c;
          a--,b--;
          if(c<G[a][b])
          G[a][b] = G[b][a] = c;
       }
       cout<<Dijkstra(0)<<endl;
    }
    return 0;
}

Dijkstra+Priority_Queue:
#include<iostream>
#include<queue>
using namespace std;
struct node
{
  int v;
  int dis;
  node(){}
  node(int vv,int diss):v(vv),dis(diss){}
  bool operator<(const node &n) const
  {
       return dis>n.dis;
  }
};
typedef priority_queue<node> PQ;
const int SIZE = 110;
const int INF = 0xfffffff;
int vis[SIZE];
int dis[SIZE];
int G[SIZE][SIZE];
#define MIN(a,b) a>b?b:a
void init()
{
     memset(vis,0,sizeof(vis));
     for(int i=0;i<SIZE;i++)dis[i]=INF;
     for(int i=0;i<SIZE;i++)
     for(int j=0;j<SIZE;j++)
     G[i][j] = INF;
}
int Dijkstra(int s,int n)
{
    dis[s] = 0;
    PQ pq;
    pq.push(node(s,dis[s]));
    for(int i=0;i<n;i++)
    {
       int v;
       do
       {
           if(pq.empty())return INF;
           v = pq.top().v;
           pq.pop();
       }while(vis[v]);
       vis[v] = 1;
       for(int j=0;j<n;j++)
       {
           if(G[v][j])
           {
              dis[j] = MIN(dis[j],dis[v]+G[v][j]);
              pq.push(node(j,dis[j]));
           }
       }
    }
    return dis[n-1];
}
int main()
{
    
    int n,m;
    while(cin>>n>>m,n||m)
    {
        init();
        for(int i=0;i<m;i++)
        {
           int a,b,c;
           cin>>a>>b>>c;
           a--,b--;
           if(G[a][b]>c)
           G[a][b]=G[b][a]=c;
        }
        cout<<Dijkstra(0,n)<<endl;
    }
    return 0;
}

Floyd:
#include<iostream>
using namespace std;
const int SIZE = 110;
int G[SIZE][SIZE];
const int INF = 0xfffffff;
#define rep(n,i) for(int i=0;i<n;i++)
void init(int n)
{
   rep(n,i)
   {
   rep(n,j)G[i][j] = INF;
   }
}
int Floyd(int n)
{
    rep(n,k)
    {
      rep(n,i)
      {
         rep(n,j)
         {
             if(G[i][j]>G[i][k]+G[k][j])
             {
                G[i][j] = G[i][k]+G[k][j];
             }
         }
      }
    }
    return G[0][n-1];
}
int main()
{
    int n,m;
    while(cin>>n>>m,n||m)
    {
       int a,b,c;
       init(n);
       rep(m,i)
       {
          cin>>a>>b>>c;
          a--,b--;
          if(G[a][b]>c)
          {
             G[a][b] = G[b][a] = c;
          }
       }
       cout<<Floyd(n)<<endl;
    }
    return 0;
}

Bellman_Ford:
#include<iostream>
using namespace std;
struct Edge
{
   int s,e;
   Edge(){}
   Edge(int ss,int ee):s(ss),e(ee){}
};
const int SIZE = 20010;
Edge edge[SIZE];
int G[110][110];
int d[110];
void init()
{
    for(int i=0;i<110;i++)
    for(int j=0;j<110;j++)
    G[i][j] = 0xfffffff,d[i]=0xfffffff;
}
void Relax(int u,int v)
{
    if(d[v]>d[u]+G[u][v])
    d[v] = d[u]+G[u][v];
}
void Bellman_Ford(int n,int m)
{
   d[0] = 0;
   for(int i=0;i<n-1;i++)
   {
      for(int j=0;j<m;j++)
      Relax(edge[j].s,edge[j].e);
   }  
}
int main()
{
    int n,m;
    while(cin>>n>>m,n||m)
    {
       init();
       for(int i=0;i<m;i++)
       {
          int a,b,c;
          cin>>a>>b>>c;
          a--,b--;
          if(G[a][b]>c)
          {
            G[a][b] = G[b][a] = c;
          }
       }
       int cnt = 0;
       for(int i=0;i<n;i++)
       for(int j=0;j<n;j++)
       {
          if(G[i][j]!=0xfffffff)
          {
             edge[cnt].s = i;
             edge[cnt].e = j;
             cnt++;
          }
       }
       Bellman_Ford(n,cnt);
       cout<<d[n-1]<<endl;
    }
    return 0;
}


SPFA:
#include<iostream>
using namespace std;
#include<queue>
#define N 110
#define INF 0xfffffff
int vis[N];
int map[N][N];
int d[N];
void spfa(int s,int n)
{
    memset(vis,0,sizeof(vis));
    memset(d,127,sizeof(d));
    d[s] = 0;
    vis[s] = 1;
    queue<int> q;
    q.push(s);
    while(!q.empty())
    {
       int v = q.front();
       q.pop();
       vis[v] = 0;
       for(int i=0;i<n;i++)
       {
          if(map[v][i])
          {
              if(map[v][i]+d[v]<d[i])
              {
                 d[i] = map[v][i]+d[v];
                 if(!vis[i])
                 {
                    vis[i] = 1;
                    q.push(i);
                 }
              }
          }
       }
    }
}
int main()
{
    int n,m;
    while(cin>>n>>m,n||m)
    {
        memset(map,0,sizeof(map));
        for(int i=0;i<m;i++)
        {
           int a,b,c;
           cin>>a>>b>>c;
           a--,b--;
           if(map[a][b]==0||map[a][b]>c)
           map[a][b] = map[b][a] = c;
        }                 
        spfa(0,n);
        cout<<d[n-1]<<endl;
    }
    
    return 0;
}

0
0
分享到:
评论

相关推荐

    算法合集之《最短路算法及其应用》

    我们将深入学习几种常见的最短路算法,并了解它们在MATLAB环境中的实现。 1. Dijkstra算法:Dijkstra算法是由荷兰计算机科学家艾兹格·迪科斯彻提出的,用于解决单源最短路径问题。它以贪心策略为基础,每次选取...

    最短路算法模板 最短路算法模板

    这里我们将深入探讨几种常见的最短路算法及其应用。 1. **Floyd-Warshall算法**: 这是一种动态规划方法,适用于解决所有顶点对之间的最短路径。Floyd-Warshall算法通过不断尝试所有可能的中间节点来更新距离矩阵...

    K最短路算法实现(KSP)

    《K最短路算法实现详解》 在计算机科学与图论领域,K最短路算法(K-Shortest Paths,简称KSP)是一项用于寻找网络中源节点到目标节点前K条最短路径的算法。它广泛应用于交通规划、网络优化、数据通信等多个领域。...

    Dijkstra 最短路算法

    C#实现Dijkstra算法通常包括以下几个步骤: 1. **初始化**:创建一个优先队列,将源节点放入队列并设置其距离为0,其他所有节点距离设为无穷大。同时,创建一个邻接矩阵或邻接表来存储图的信息。 2. **主循环**:...

    基于MATLAB实现的最短路和次短路算法 程序源代码.rar

    最短路算法和次短路算法就是解决这类问题的关键技术。本资源提供了基于MATLAB实现的这两种算法的程序源代码,对于学习和研究算法有着重要的价值。 MATLAB是一种强大的数学计算和编程环境,它以其简洁的语法和丰富的...

    最长路算法_和_最短路算法__matlab.docx

    最长路算法和最短路算法在MATLAB中的实现 在计算机科学和信息论中,图论是研究图的数学理论和算法的一门学科。图论有很多实际应用,如网络拓扑结构、交通网络、社交网络等。在图论中,寻找从一个节点到其他节点的...

    Java版的K最短路算法 yen

    Java版的K最短路算法Yen是一种在图论领域广泛应用的算法,主要解决网络中的路径寻找问题。在交通咨询系统、物流规划、电信网络优化等领域都有它的身影。本项目是一个用Java语言实现的Yen算法,对于学习和理解算法...

    模拟退火算法求最短路.zip

    它包含以下几个主要步骤: 1. **初始化**:设置初始温度T和初始解s,通常初始解可以随机生成。 2. **接受准则**:以概率e^(-ΔE/T)接受新解,其中ΔE是新旧解之间的能量差,T是当前温度。 3. **降温策略**:根据...

    通信网理论基础:05-最短路算法.pptx

    Label-Setting算法是一种常用的最短路算法,它通过对图中的每个顶点分配一个距离标记(Label),来记录从源点到该顶点的最短距离。Label-Setting算法的关键是如何维护距离标记,并选择下一个加入最短路径树的顶点。 ...

    最短路问题及算法

    最短路径问题可以分为几类: 1. **确定起点的最短路径问题**:已知起始结点,求解该结点到图中其他所有结点的最短路径。 2. **确定终点的最短路径问题**:与确定起点的问题相反,已知终点结点,求解图中所有结点到...

    TSP用遗传算法做最短路环游中国的MATLAB代码

    【标题】"TSP用遗传算法做最短路环游中国的MATLAB代码"涉及的核心知识点是旅行商问题(Travelling Salesman Problem, TSP)的解决方案,它是一个经典的组合优化问题,旨在寻找访问每座城市一次并返回起始城市的最短...

    图论最短路dijkstra算法.doc

    该算法的步骤可以概括为以下几个步骤: 1. 初始化:将所有节点的距离设置为无穷大,除了起始点设置为 0。 2. 选择节点:选择当前距离最小的节点作为当前节点。 3. 更新距离:将当前节点的邻居节点的距离更新为当前...

    java最短路算法代码

    从给定的文件标题“java最短路算法代码”及描述来看,这段代码涉及的是Java编程语言中的图形绘制方法以及一个具体的最短路径算法——弗洛伊德算法(Floyd Algorithm)的实现。下面我们将详细解析这段代码所涵盖的...

    最短路和次短路.zip

    最短路算法主要包括以下几种: 1. **Dijkstra算法**:这是最常用的单源最短路径算法,适用于非负权重的图。Dijkstra算法通过维护一个优先队列(如二叉堆)来逐步扩展最短路径树,直到到达目标节点。每次从队列中...

    C++算法:CSP-J2023 T4 旅游巴士 题解(最短路算法)

    如题,这是 CSP-J 2023 第二轮的第四题,属于最短路算法,考虑使用 Dijkstra 算法。 但是,跟模板不同的是,这道题中有一些限制条件。比如走某条路必须在某个时刻点以后,这就导致到中间耗时最少的路径反而走不通,...

    图论matlab实现,各种图论的求解,最短路、哈密尔顿回路等等

    1. **最短路算法**:最短路问题是在图中找到从一个起点到其他所有顶点的最短路径。Dijkstra算法是最常用的单源最短路径算法,适用于有向无权图或非负权重图。Floyd-Warshall算法则可以解决所有对间的最短路径问题,...

    k最短路程序源码.zip

    《k最短路算法解析与实现》 在图论领域,寻找从源节点到目标节点的最短路径是一项基础且重要的任务。而当我们要寻找不仅仅是单条,而是多条具有不同权重的最短路径时,k最短路算法就显得尤为关键。本文将深入探讨k...

Global site tag (gtag.js) - Google Analytics