題目地址
題目大意:
求某兩個點之間的最短距離,起點爲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;
}