赞
踩
Dijkstra算法的伪代码:
用领接矩阵实现Dijkstra算法 P371
C++中return 0;与return;的区别
[fill()函数的使用(a,a+10)C语言左闭右开)
const MAXV = 1000; //最大顶点数
const INF = 1000000000; //设INF为一个很大的数
int n,G[MAXV][MAXV]; // n为顶点数,MAXV为最大顶点数 int d[MAXV]; //起点到大各点的最短路径长度 bool vis[MAXV]={false}; //标记数组 vis[i]==true表示已访问。初值均为false void Dijkstra(int s){ //s为起点 fill(d,d+MAXV,INF); //fill函数将整个d数组赋为INF(慎用memset) d[s] = 0; // 起点s到自身的距离为0 for(int i=0;i<n;i++) { int u=-1,MIN=INF; //u使d[u]最小,MIN存放该最小的d[u] for(int j=0;j<n;j++) //找到未访问的顶点中d[]最小的 { if(vis[j] == false && d[j] < MIN) { u=j; MIN=d[j]; } } //找不到小于INF的d[u],说明剩下的顶点和起点s不连通 if(u == -1) return; vis[u] = true; //标记u为已访问 for(int v=0;v<n;v++) //如果v未访问&&u能到达v&&以u为中介点可以是d[v]更优 { if(vis[v] == false && G[u][v] != INF && d[u] + G[u][v]<d[v]) { d[v]=d[u]+G[u][v]; //优化d[v] } } } }
亚历山大的例子:
#include<cstdio> #include<algorithm> using namespace std; const int MAXV = 1000; //最大顶点数 const int INF = 1000000000; //设INF为一个很大的数(10^9) 或使用16进制0x3fffffff 表示不可达 int n,m,s,G[MAXV][MAXV]; // n为顶点数,m是边数,s是起点,MAXV为最大顶点数 int d[MAXV]; //起点到各点的最短路径长度 bool vis[MAXV]={false}; //标记数组 vis[i]==true表示已访问。初值均为false void Dijkstra(int s){ //s为起点 fill(d,d+MAXV,INF); //fill函数将整个d数组赋为INF(慎用memset) d[s] = 0; // 起点s到自身的距离为0 for(int i=0;i<n;i++) { int u=-1,MIN=INF; //u使d[u]最小,MIN存放该最小的d[u] u是与起点s的最短距离最小的一个顶点 for(int j=0;j<n;j++) //找到未访问的顶点中d[]最小的 { if(vis[j] == false && d[j] < MIN) { u=j; MIN=d[j]; } } //找不到小于INF的d[u],说明剩下的顶点和起点s不连通 if(u == -1) return; vis[u] = true; //标记u为已访问 for(int v=0;v<n;v++) //如果v未访问&&u能到达v&&以u为中介点可以是d[v]更优 d[v]是s到顶点v的最短距离 { if(vis[v] == false && G[u][v] != INF && d[u] + G[u][v]<d[v]) { d[v]=d[u]+G[u][v]; //优化d[v] } } } } int main() { int u,v,w; scanf("%d%d%d",&n,&m,&s); //顶点个数、边数、起点编号 fill(G[0],G[0]+MAXV*MAXV,INF); //初始化图G for(int i=0;i<m;i++) { scanf("%d%d%d",&u,&v,&w); //输入u,v以及u->v的边权 G[u][v] = w; } Dijkstra(s); //Dijkstra算法入口 for(int i=0;i<n;i++) { printf("%d",d[i]); //输出所有顶点的最短距离 } return 0; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。