PAT (Advanced) 1003. Emergency (25)
来源:互联网 发布:gta5捏脸数据男 编辑:程序博客网 时间:2024/06/14 07:12
原题:1003. Emergency (25)
典型的最小路径问题,注意以下即可:
1.需设置一个数组记录到当前点的最小路径数,更新最小路径时,继承上一点的路径数即可,最小路径长度相等时,需要加上上一点的路径数。
2.需额外设置一个数组记录救护队的数目,并作为第二判断依据,在路径相等时,取最大值即可。
注:Dijkstra算法的大致流程:设定两个点集,一个为访问过的,一个为未访问的,每次从未访问的点集中取一点,并计算经过当前点后所有的路径长度变化,若变小,则更新当前的路径,详细描述请参考代码。
代码采用Dijkstra算法,c++代码如下:
#include<cstdio>#include<algorithm>using namespace std;const int maxn = 510;const int INF = 0x3fffffff; // 表示边不存在int G[maxn][maxn], teamNum[maxn];int vis[maxn];int d[maxn], totalTeam[maxn], num[maxn];int n, m, c1, c2;void Dijkstra(int st){ //初始化 fill(d, d + maxn, INF); fill(vis, vis + maxn, 0); fill(totalTeam, totalTeam + maxn, 0); fill(num, num + maxn, 0); //起点初始状态 d[st] = 0; totalTeam[st] = teamNum[st]; num[st] = 1; //Dijkstra 主算法 for(int i = 0; i < n; i++) { //选取当前离已经过运算的点集最近的点 int u = -1, MIN = INF; for(int j = 0; j < n; j++) { if(vis[j] == 0 && d[j] < MIN) { u = j; MIN = d[j]; } } if(u == -1) return; //当前的连通分量中已无符合条件的点 vis[u] = 1; for(int j = 0; j < n; j++) { if(vis[j] == 0 && G[u][j] != INF) { //经过当前点的路径更短时, 更新最短路径与救援队伍数量 if(d[j] > d[u] + G[u][j]) { d[j] = d[u] + G[u][j]; num[j] = num[u]; //路径继承 totalTeam[j] = teamNum[j] + totalTeam[u]; } //相等时, 考虑救援队伍数量 else if(d[j] == d[u] + G[u][j]) { num[j] += num[u]; //加上当前u点的最小路径数 if(teamNum[j] + totalTeam[u] > totalTeam[j]) { totalTeam[j] = totalTeam[u] + teamNum[j]; } } } } }}int main(){ while(scanf("%d%d%d%d", &n, &m, &c1, &c2) != EOF) { //初始化 for(int i = 0; i < n; i++) for(int j = 0; j < n; j++) G[i][j] = INF; for(int i = 0; i < n; i++) { scanf("%d", &teamNum[i]); } for(int i = 0; i < m; i++) { int st, ed, l; scanf("%d%d%d", &st, &ed, &l); G[st][ed] = G[ed][st] = l; // 注意无向图的处理 } Dijkstra(c1); printf("%d %d\n", num[c2], totalTeam[c2]); } return 0;}
阅读全文
0 0
- PAT (Advanced) 1003. Emergency (25)
- 【PAT Advanced Level】1003. Emergency (25)
- PAT (Advanced Level) Practise 1003. Emergency (25)
- PAT (Advanced Level) Practise 1003. Emergency (25)
- PAT (Advanced Level) 1003. Emergency (25)
- 【PAT】【Advanced Level】1003. Emergency (25)
- PAT (Advanced Level) Practise 1003. Emergency (25)
- 浙大PAT (Advanced Level) Practise 1003. Emergency (25)
- 编程题目:PAT(Advanced Level) Practice 1003. Emergency (25)
- PAT Advanced Level 1003. Emergency (25)(Java and C++)
- 1003. Emergency (25)——PAT (Advanced Level) Practise
- PAT (Advanced Level) 1003. Emergency (25) 最短路径 DFS
- PAT (Advanced Level) Practise 1003. Emergency (25) Dijstra扩展应用
- PAT (Advanced Level) 1003. Emergency (25) 解题报告
- [PAT (Advanced Level) ]1003. Emergency 解题文档
- PAT (Advanced Level) Practise 1003Emergency (25)
- 1003. Emergency (25)-PAT
- (PAT)1003. Emergency (25)
- java面向对象(五)之多态
- [博弈小结]
- PTA1.1-顺序表基本操作
- Java定义方法相关
- Linux 安装python环境
- PAT (Advanced) 1003. Emergency (25)
- 集合的所有子集的算法
- 格式化输出n天后的时间(java实现 )
- 论文阅读笔记:SSD: Single Shot MultiBox Detector
- Linux下tomcat如何加端口号
- HDU 2222 (AC自动机)
- Unity3d:世界坐标系
- 实训第一次课
- 欢迎使用CSDN-markdown编辑器