無向圖最短路徑算法


#include <iostream>
#include<bits/stdc++.h>
using namespace std;
///本題找的是頂點1到其他各個點之間的最短路徑,並將最短路徑存放在dis[]這個數組里面,最后只要遍歷輸出這個數組就可以得到
int main()
{
int inf=9999999;//表示無窮大,就是兩個頂點之間沒有鏈接
int e[10][10];///表示鄰接矩陣,記住一定不要把數組開的特別大,如[1000][1000],就是程序卡頓,異常閃退
int dis[10];//表示頂點1到各個頂點之間的距離
int book[10];//標記該定點是否是被訪問
int n,m;//頂點數和邊數
int v1,v2,length;//表示兩個頂點以及之間的距離
int min;///最小距離
int u;///為標記的點中dis[i]值最小時對應的i,就是dis數組中元素最小的下標值
cin>>n>>m;
int i,j,k;
for(i=1;i<=n;i++)///構建一個鄰接矩陣
for(j=1;j<=n;j++)
{
if(i==j)
e[i][j]=0;
else
e[i][j]=inf;
}
for(i=1;i<=m;i++)///構建邊,注意這里構建的是有向圖,而不是無向圖
{
cin>>v1>>v2>>length;
e[v1][v2]=length;///有向圖
}
for(i=1;i<=n;i++)///初始化dis數組,這里要求的是1號頂點到其余各點的初始路程
{
dis[i]=e[1][i];
}
///初始化book數組,這里面存的是已經被標記過的點
for (int i = 1; i <= n; i++)
book[i] = 0;
book[1] = 1;///表示1點是已經被標記過的點

///核心代碼
for(i=1;i<=n-1;i++)
{
min=inf;
for(j=1;j<=n;j++)
if(book[j]==0&&dis[j]<min)///找到dis中未標記點中的最小值,u為最小侄的下標
{
min=dis[j];
u=j;
}
book[u]=1;
for(k=1;k<=n;k++)
{
if(e[u][k]<inf)
{
if(dis[k]>dis[u]+e[u][k])
dis[k]=dis[u]+e[u][k];
}
}
}
for(i=1;i<=n;i++)
cout<<dis[i]<<" ";
return 0;
}
///輸入以下
/*
6 9
1 2 1
1 3 12
2 3 9
2 4 3
3 5 5
4 3 4
4 5 13
4 6 15
5 6 46
*/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM