dijkstra算法演示
dijkstra算法演示精髓
#include <iostream> #include <fstream> #include <cstring> #include <vector> #include <queue> #include <stack> #include <algorithm> #include <cmath> using namespace std; #define loop(i,n) for(int i=0;i<(n);i++) #define loop2(i,n) for(int i=1;i<=(n);i++) const int maxn=10; int inf=99999999; int e[maxn][maxn],dis[maxn],book[maxn]; int n,m; void dijkstra(void) { //找到离1号顶点最近的点 int u,v; int xmin; loop2(i,n-1) { xmin=inf; loop2(j,n) { if(book[j]==0 && dis[j]<xmin) { xmin=dis[j]; u=j; } } book[u]=1; loop2(v,n) //松驰 { if(e[u][v]<inf) if(dis[v]>dis[u]+e[u][v]) dis[v]=dis[u]+e[u][v]; } } } void test() { freopen("dijkstra.in","r",stdin); //freopen("dijkstra.out","w",stdout); cin>>n>>m; cout<<n<<" "<<m<<endl; loop2(i,n) loop2(j,m) if(i==j)e[i][j]=0; else e[i][j]=inf; int t1,t2,t3; loop2(i,m) { cin>>t1>>t2>>t3; e[t1][t2]=t3; } loop2(i,n) dis[i]=e[1][i]; book[1]=1; dijkstra(); loop2(i,n) cout<<dis[i]<<" "; cout<<endl; } int main () { test(); return 0; }
test data:
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 4
/***********************************************
看书看原版,原汁原味。
不会英文?没关系,硬着头皮看下去慢慢熟练,才会有真正收获。
没有原书,也要网上找PDF来看。
网上的原版资料多了去了,下载东西也到原始下载点去看看。
你会知其所以然,呵呵。
***********************************************/