最短路徑-POJ-2387

題目點這裏

題目大意

給一個無向圖,首先輸入兩個整數T和N,T 表示邊的數目,N表示頂點數目。接下來輸入 T 組數據,格式爲u v w,求出第一個頂點到最後一個定點的最短路徑。

題解

題目要求的是單源最短路,並且權值沒有負數,應用Drikstra算法即可求得。
需要一個數組dist用來保存第一個頂點F到所有頂點當前的最短路徑長度,一個標記數組visited用來標記是否已處理過。每次從未處理過的頂點集合中B選擇一個與第一個頂點距離最短的點P加入到集合中A中(用標記數組即可識別哪些點處理過,哪些未處理過),然後更新所有與P連接的點J到F的距離,若distance(F,P)+distance(P,J)< distance(F,J),則更新。直到求出所有點到F的最小距離。

代碼

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int Maxn = 1005;
const int Inf = 1 << 30;
int fileds[Maxn][Maxn];
int dist[Maxn];
bool visited[Maxn];
int n;
void Dirkstra(int s)
{
    memset(visited,false,sizeof(visited));
    int i,j,k;
    for(i = 1;i <= n;++i)
        dist[i] = fileds[s][i];
    for(i = 1;i<= n;++i)
    {   
        int Min = Inf;
        int k;
        for(j = 1;j <= n;++j)
        {
            if(dist[j] < Min && !visited[j])
            {
                Min = dist[j];
                k = j;
            }
        }
        visited[k] = true;
        for(j = 1;j <= n;++j)                   //更新 
        {
            if((!visited[j]) && (dist[k]+fileds[k][j] < dist[j]))
                dist[j] = dist[k]+fileds[k][j];
        }
    }
}
int main()
{
    int t;
    scanf("%d%d",&t,&n);
    for(int i = 1;i <= n;++i)
    {
        for(int j = 1; j <= n;++j)
        {
            fileds[i][j] = Inf;
        }
    }
    for(int i = 1;i <= t;++i)
    {
        int u,v,w;
        scanf("%d%d%d",&u,&v,&w);
        if(w < fileds[u][v])
        {
            fileds[u][v] = w;
            fileds[v][u] = w;
        }
    }
    Dirkstra(1);
    printf("%d\n",dist[n]);
}
發佈了48 篇原創文章 · 獲贊 17 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章