PAT A1003 Emergency(25)
来源:互联网 发布:福禄克网络测试 编辑:程序博客网 时间:2024/06/05 11:01
题意
- 给定图(城市,路),给定边权(路程),点权(救援队数目),求两点间最短路条数(边权和最小),并求其中点权和的最大值。
注意
fill
函数初始化二维数组的写法和陷阱。Dijkstra
算法的扩展- 在
<
和==
处理上,注意最短路数目在==
情况下可直接加。 - 为每个点设两个数组,分别用于保存起点到该点的最短路数目和点权和。
- 在
- 边权和最小值与点权和最大值在路径上可传递,满足最优性原理。
- 证明:设
r
为s
到t
的一条最短路且是在所有从s
到t
的最短路中点权和最大的最短路,设t
的前驱结点t0
,则在r
中s
到t0
的路径r0
也是如此。不然可找到一条s
到t0
的路径r1
,r1
要么比r0
更短要么和r0
一样短但点权和比r0
更大,则将r1
替换r0
,可得原假设r
不成立,所以矛盾,所以原命题成立。
单词
- scatter 分散
代码
#include <iostream>#include <climits>using namespace std;const int MAX = 500;int n, m;int s, t;int v_wei[MAX]; //点权int e_wei[MAX][MAX];//边权int road[MAX]; //最短路条数(至起点)(*)int v_max[MAX]; //最短路的点权最大(至起点)(*)int e_min[MAX]; //边权最小(最短路长度)(至起点)bool S[MAX]; //S集void Dijkstra(int s0){ fill(S, S + n, false); fill(e_min, e_min + n, INT_MAX); v_max[s0] = v_wei[s0]; e_min[s0] = 0; ///// s0作为起点还未加入 road[s0] = 1; for (int i = 0; i < n; i++) { int min = INT_MAX; int u; for (int j = 0; j < n; j++) { if (!S[j] && e_min[j] < min) { min = e_min[j]; u = j; } } S[u] = true; ////////////// for (int k = 0; k < n; k++) { if (!S[k] && e_wei[u][k] != INT_MAX) ///////// { if (e_min[u] + e_wei[u][k] < e_min[k]) { road[k] = road[u]; /////////// e_min[k] = e_min[u] + e_wei[u][k]; v_max[k] = v_max[u] + v_wei[k]; } else if (e_min[u] + e_wei[u][k] == e_min[k]) { road[k] += road[u]; ////////////// 这里road[k]的旧值必定被以前轮次的 u 赋过值,不然else if条件不可能成立,因为e_min初始化均为INT_MAX if (v_max[k] < v_max[u] + v_wei[k]) v_max[k] = v_max[u] + v_wei[k]; } } } }}int main(){ scanf_s("%d%d%d%d", &n, &m, &s, &t); for (int i = 0; i < n; i++) scanf_s("%d", &v_wei[i]); fill(e_wei[0], e_wei[0] + MAX*MAX, INT_MAX); //// [0] MAX*MAX!!!!!!!!!!!!!! int v1, v2; for (int i = 0; i < m; i++) { scanf_s("%d%d",&v1,&v2); scanf_s("%d", &e_wei[v1][v2]); e_wei[v2][v1] = e_wei[v1][v2]; } Dijkstra(s); printf("%d %d", road[t], v_max[t]); return 0;}
0 0
- PAT A1003 Emergency(25)
- PAT A1003. Emergency (25)
- pat-a1003. Emergency (25)
- PAT A1003 Emergency
- PAT甲级练习题A1003. Emergency
- a1003. Emergency (25)
- PAT A1003
- PAT-A1003
- 1003. Emergency (25)-PAT
- (PAT)1003. Emergency (25)
- Pat 1003 Emergency (25)
- PAT 1003. Emergency (25)
- PAT 1003. Emergency (25)
- [PAT]1003. Emergency (25)
- 【PAT】1003. Emergency (25)
- PAT 1003. Emergency (25)
- PAT 1003. Emergency (25)
- PAT 1003. Emergency (25)
- 四种第三方登录
- 每天一个linux命令:find命令之exec
- 1st group anagram 49
- PART VIII 总结 Chapter 17 计算的限制
- 动规-区间DP模板
- PAT A1003 Emergency(25)
- 阿里面试回来,想和Java程序员谈一谈
- 异常解决—org.hibernate.QueryException: could not resolve property: “xxx”
- 动规-树形DP
- Python logger模块应用示例
- 动规-树形DP模板
- 每天一个linux命令:find命令之xargs
- Mac和Linux系统的:Arp欺骗源码
- 动规-概率DP