最短路 dijkstra

最短路徑問題
題目描述
平面上有 n 個點(n<=100),每個點的座標均在-10000~10000 之間。其中的一些點之間有連線 。若有連線,則表示可從一個點到達另一個點,即兩點間有通路,通路的距離爲兩點間的直線距離 。現在的任務是找出從一點到另一點之間的最短路徑 。
輸入
輸入共 n+m+3 行,其中:
第一行爲整數 n。
第 2 行到第 n+1 行    (共 n 行 ),每行兩個整數 x 和 y,描述了一個點的座標。
第 n+2 行爲一個整數 m,表示圖中連線 的個數。
此後的 m 行(m<=1000),每行描述一條連線,由兩個整數 i和 j 組成,表示第 i個點和第 j 個點之
間有連線 。
最後一行 :兩個整數 s 和 t,分別表示源點和目標點。
輸出
輸出僅一行,一個實數(保留兩位小數),表示從 s 到 t 的最短路徑長度 。
樣例輸入
5 0 0 2 0 2 2 0 2 3 1 5 1 2 1 3 1 4 2 5 3 5 1 5
樣例輸出
3.41

代碼

#include<iostream> 
#include<cstdio> 
#include<cmath> 
#include<cstring> 
using namespace std; 
float work(int x1,int x2,int y1,int y2) 

    return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)); 

int n,m,s,t; 
float x[101]={0},y[101]={0},w[101][101],dis[101]={0};  
bool pd[101][101],used[101]={0}; 
int main() 

    memset(w,0,sizeof(w)); 
    memset(pd,0,sizeof(pd)); 
    memset(dis,127,sizeof(dis)); 
    cin>>n; 
    for(int i=1;i<=n;i++) 
    {cin>>x[i]>>y[i];} 
    cin>>m; 
    for(int i=1;i<=m;i++) 
        { 
            int a,b; 
            cin>>a>>b; 
            w[b][a]=w[a][b]=work(x[a],x[b],y[a],y[b]); 
            pd[a][b]=pd[b][a]=1; 
        } 
    cin>>s>>t; 
    dis[s]=0; 
    for(int i=1;i<=n;i++) 
        { 
            int mini=0;
            for(int j=1;j<=n;j++)
                if(!used[j]&&dis[j]<dis[mini])mini=j;//起初的mini=0即賦最大值
            if(mini==0)break;
            used[mini]=1;
            for(int j=1;j<=n;j++)
                if(pd[mini][j]&&dis[mini]+w[mini][j]<dis[j])
                    dis[j]=dis[mini]+w[mini][j];
        }
    printf("%.2f",dis[t]);
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章