一、题目略
二、思路
单源最短路径算法
无向图,求起点到终点的最短路径数量,及最大权重和
不需要记录其父节点,只用计算最大权重即可
多计算一个最短路径数量
三、代码
···
#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 ;
疑惑,求解……