PTA-1003 Emergenc-C++实现

一、题目略
二、思路

单源最短路径算法
无向图,求起点到终点的最短路径数量,及最大权重和
不需要记录其父节点,只用计算最大权重即可
多计算一个最短路径数量

三、代码
···
#include
#include
using namespace std;
#define INF 0x3f3f3f
int main() {

int c_num, r_num, c1, c2;//城市数量,路径数量,终点,起点
cin >> c_num >> r_num >> c1 >> c2;
int map[501][501]; //邻接矩阵
int weight[501];  //各城市消防队数量
int paths[501];//到达该点的路径数量
int teams[501]; //到达该点的消防队数量
int flag[501];
int dis[501];  //距离起点的距离
int i1,i2;

int min, index;
int len = 0; //路径长度
memset(map, 0, sizeof(map));
memset(dis, INF, sizeof(dis));
memset(flag, 0, sizeof(flag));
//读入每个城市的消防队数量
for (int i = 0; i < c_num; i++) {
	cin >> weight[i];
}

//读入路线,邻接矩阵为对称矩阵
for (int i = 0; i < r_num; i++) {
	cin >> i1 >> i2>>len;
	map[i1][i2] = map[i2][i1] = len;
}
//起点c1
dis[c1] = 0;
paths[c1] = 1;
teams[c1] = weight[c1];

for (int i = 0; i < c_num; i++) {
	//找dis最小值
	min = INF;
	index = -1;
	for (int i = 0; i < c_num; i++) {
		if (flag[i] == 0 && dis[i] < min ) {
			min = dis[i];
			index = i;
		}
	}
	//cout << "index=" << index << endl;
	if (index == -1)
		break;
	
	flag[index] = 1;
	for (int i = 0; i < c_num; i++) {
		if (flag[i] == 0 && map[index][i] != 0) {
			if(dis[i] > (dis[index] + map[index][i])){
				dis[i] = dis[index] + map[index][i];
				teams[i] = teams[index] + weight[i];
				paths[i] = paths[index];
			}
			else if(dis[i] == (dis[index] + map[index][i])) {  //关键点
				teams[i] = teams[i]>(teams[index] + weight[i])? teams[i] : (teams[index] + weight[i]);
				paths[i] += paths[index];   //原有数量基础上相加
			}
		}
	}
	
	
}
cout << paths[c2] << " "<< teams[c2]<<endl ;

return 0;

}
···
四、总结
1、#define INF 0x3f3f3f
2、#include <bits/stdc++.h>
可替代c++所有头文件(万能头文件)
3、最后输出条件
All the numbers in a line must be separated by exactly one space, and there is no extra space allowed at the end of a line.
正确格式:cout << paths[c2] << " "<< teams[c2]<<endl ;
错误格式: cout << paths[c2] << ends<< teams[c2]<<endl ;
疑惑,求解……

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值