1030 Travel Plan(考察迪杰斯特拉+第二标尺)

 大致题意就是。。。懒得说了。

这是一道模板题,要先记住大体流程,然后反复练习。

 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 }

1030 Travel Plan(考察迪杰斯特拉+第二标尺)

 

上一篇:dotnet---批处理执行发布,上传,连接服务器


下一篇:原生js如何获取带有某个class的所有div元素