题意:
条件:给出M条路、起点和终点以及每个点含有的救援队的数量。
要求:
1. 找出从起点到终点的最短路径的条数
2. 所有最低路径中能召集最多救援队的数量。
3. 能召集最多救援队的最短路径
思路:
求单源最短路径可以使用Dijstra算法。
复杂度为:500^2 ,不会超时。
Dijstra算法:
思想:
G(V,E)V表示图中所有的顶点,E表示图中所有的边。
对G(V,E)设置一个集合S,存放访问过的顶点,从集合V-S
中选择与起点s的最短距离最小的一个顶点(记为u),访问并加入集合S,
之后,令顶点u为中介点,优化起点s与所有从u能到达的顶点v之间的最短距离。
这样的操作执行n次,直到S中包含所有顶点。
参考:算法笔记
基本模板(找出从起点到其他各点的最短距离):
const int INF = 0x3f3f3f3f;
//以邻接表形式保存图,稀疏图用邻接表,稠密图用邻接矩阵
typedef struct{
int next;
int len;
}
vector<Node> V[N];
bool vis[N];//标记访问过的顶点
int dis[N];//记录从起点开始到其他各点的距离
void Dijstra(int s){
//起点到自身的距离为0
dis[s] = 0;
//循环n次
for(int i = 0; i < n; i++){
int u = -1;
int min = INF;
//选择与起点s的最短距离最小的一个未访问顶点(记为u)
for(int j = 0; j < n; j++){
if(!vis[j] && dis[j] < min){
u = j;
min = dis[j]
}
}
//如果找不到未被访问过的顶点,说明找不到其他与s相通的顶点,跳出循环
if(u == -1){
break;
}
//标记u为已访问
vis[u] = true;
//令顶点u为中介点,优化起点s与所有从u能到达的顶点v之间的最短距离
for(int j = 0; j < V[u].size(); j++){
int v = V[u][j].next;
int len = V[u][j].len;
//如果v已经访问过,则跳过该点
if(vis[v]