起點終點未定的最短路徑——ACM_HongKong D題

題目地址

ACM 2017 Asia HongKong D題

題目大意:

求某兩個點之間的最短距離,起點爲a,終點爲b,然後,求兩個點之間的最短距離。

算法思路:

  • 本題採用迪傑斯特拉算法求最短路徑。
  • 由於迪傑斯特拉算法的特性,求所有終點的最短路徑好求。
  • 關鍵是不定起點的要求。
  • 不過代碼還是很好改。
  • 算是模板題了

代碼如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<algorithm>
#define inf 1<<29
#define MAXV 51
using namespace std;
int map[51][51];
int n;
int a,b;
//相當於2的29次方
//相當於無限大
void dijkstra(int a,int b){
    int i,j,min,v;
    int d[MAXV];//最短路徑
    bool vis[MAXV];
    //記錄該點是否已經加入了圖中
    for(i=1;i<=n;i++){
        vis[i]=0;
        d[i]=map[a][i];
        //不定長度需要修改的地方1
    }
//初始化所有的點到起點的距離
    for(i=1;i<=n;i++){
        min=inf;//初始化爲無窮大
        for(j=1;j<=n;j++)
            if(!vis[j] && d[j]<min){
              //如果該點還不在整個最短路徑途中
              //如果該點到起始點的距離爲
                v=j;//找的路徑最短的點
                min=d[j];//設置最短路徑
            }//尋找在這個圖的規模中的最短路徑
        vis[v]=1;
       //設置爲已找到
        for(j=1;j<=n;j++)
            if(!vis[j] && d[j]>map[v][j]+d[v])//更新條件
            //1.還沒找到最短路徑
            //2.dj比新找到的點的最短路徑加上到新加的點的最短路徑的和要短
                d[j]=map[v][j]+d[v];//更新dj
    }//所有點的最短路徑都找到了
    //輸出到最後一個點的最短距離
    printf("%d\n",d[b]);
    //需要修改的地方2
}
int main()
{
    int i,j;
    int x,y,len;
    while(cin>>n){
      cin>>a>>b;
      for(i=1;i<=n;i++)
            for(j=1;j<=n;j++){
                if(i==j){
                    map[i][i]=0;}//從一個點到這個點本身的最短距離爲零
                else {map[i][j]=map[j][i]=inf;}}//初始化爲無窮大
//相當於memset函數的作用
      while(cin>>x&&x!=0){
        cin>>y>>len;
         if(map[x][y]>len) map[x][y]=map[y][x]=len;//賦值
      }
      dijkstra(a,b);
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章