大致题意就是。。。懒得说了。
这是一道模板题,要先记住大体流程,然后反复练习。
1 #include<iostream> 2 #include<algorithm> 3 using namespace std; 4 const int maxn = 510; 5 const int inf = 0x3fffffff; 6 //图的要素 7 int G[maxn][maxn];//邻接矩阵、边权 8 bool visited[maxn] = {false};//标记已访问数组 9 10 //迪杰斯特拉算法的要素 11 int d[maxn];//从起点S到其它顶点的最短距离 12 int pre[maxn];//起点S到终点D的路径 13 14 //第二标尺的要素 15 int cost[maxn][maxn];//边的费用 16 int c[maxn]; //从起点S到其它顶点的最少费用 17 18 int n,m,st,ed; 19 20 void dijkstra(int s) { 21 //第一步,初始化d[]、c[]、pre[] 22 fill(d,d+maxn,inf); 23 fill(c,c+maxn,inf); 24 for(int i = 0; i < n ; ++i) pre[i] = i; 25 d[s] = 0; 26 c[s] = 0; 27 //第二步,循环n次 28 for(int i = 0; i < n; ++i) { 29 //第三步,遍历所有顶点u,找出最小d[u],并标记u已被访问 30 int u = -1,MIN = inf; 31 for(int j = 0; j < n; ++j) { 32 if(visited[j] == false && MIN > d[j]) { 33 u = j; 34 MIN = d[j]; 35 } 36 } 37 if(u == -1) return ; 38 visited[u] = true; 39 //第四步,遍历所有顶点v,用顶点u更新d[v]、C 40 for(int v = 0; v < n; ++v) { 41 if(visited[v] == false && G[u][v] != inf) { 42 if(d[u] + G[u][v] < d[v]) { 43 d[v] = d[u] + G[u][v]; 44 c[v] = c[u]+ cost[u][v]; 45 pre[v] = u; 46 } else if(d[u] + G[u][v] == d[v]) { 47 if(c[u]+ cost[u][v] < c[v]) { 48 c[v] = c[u]+ cost[u][v]; 49 pre[v] = u; 50 } 51 } 52 } 53 } 54 } 55 } 56 57 void DFS(int v) { //打印起点到终点的最短路径 58 if(v == st) { //找到起点,即叶子结点 59 printf("%d",v); 60 return ; 61 } 62 DFS(pre[v]);//递归访问v的前驱顶点pre[v] 63 printf(" %d",v); 64 } 65 int main() { 66 cin>>n>>m>>st>>ed; 67 //初始化G 68 fill(G[0],G[0]+maxn*maxn,inf); 69 int u,v; 70 for(int i = 0; i < m; ++i) { 71 cin>>u>>v; 72 cin>>G[u][v]>>cost[u][v]; 73 G[v][u]= G[u][v]; 74 cost[v][u] = cost[u][v]; 75 } 76 dijkstra(st);//算法入口 77 DFS(ed);//打印起点st到终点ed的路径 78 printf(" %d %d",d[ed],c[ed]); 79 return 0; 80 }