題目大意
給一個無向圖,首先輸入兩個整數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]);
}