【1003】Emergency (25 分)

简介: 【1003】Emergency (25 分)【1003】Emergency (25 分)
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
#include<algorithm>  
#include<map>
#include<vector>
#include<queue> 
using namespace std;  
//在dij基础上增加w[]和num[]数组
//w[u]表示从起点s到达顶点u可以得到的最大点权之和
//num[u]表示从起点s到达顶点u的最短路径条数
const int MAXV=510; //最大顶点数
const int INF=1000000000; //无穷大
//n为顶点数,m为边数,st和ed分别为起点和终点
//G为邻接矩阵,weight为点权
//d[]记录最短距离,w[]记录最大点权之和,num[]记录最短路径条数
int n,m,st,ed,G[MAXV][MAXV],weight[MAXV];
int d[MAXV],w[MAXV],num[MAXV];
bool vis[MAXV]={false};//vis[i]==true表示顶点i已访问,初值均为false
void Dijkstra(int s){  //s为起点
  fill(d,d+MAXV,INF);
  memset(num,0,sizeof(num));
  memset(w,0,sizeof(w));
  d[s]=0;
  w[s]=weight[s];
  num[s]=1;
  for(int i=0;i<n;i++){ //循环n次
    int u=-1,MIN=INF; //u使d[u]最小,MIN存放该最小的d[u]
    for(int j=0;j<n;j++){ //找到未访问的顶点中d[]中最小的
      if(vis[j] == false && d[j] < MIN){
        u=j;
        MIN=d[j];
      }
    }
    //找不到小于INF的d[u]说明剩下的顶点和起点s不连通
    if(u == -1) return ;
    vis[u]=true; //标记u为已访问
    for(int v=0;v<n;v++){ 
      //如果v未访问 && u能到达v && 以u为中介点可以使d[v]更优
      if(vis[v]==false && G[u][v] != INF){
        if(d[u]+G[u][v] < d[v]) {  //以u为中介点时能令d[v]变小
          d[v]=d[u]+G[u][v]; //覆盖d[v]
          w[v]=w[u]+weight[v]; //覆盖w[v]
          num[v]=num[u]; //覆盖num[v]
        }else if(d[u] + G[u][v] ==d[v]){  //找到一条相同长度的路径
          if(w[u]+weight[v] > w[v]){  //以u为中介点时点权之和更大
            w[v]=w[u]+weight[v]; //w[v]继承自w[u]
          }
          //最短路径条数与点权无关,必须写在外面
          num[v] += num[u];
        }
      }
    }
  }
}
int main(){   
  scanf("%d%d%d%d",&n,&m,&st,&ed);
  for(int i=0;i<n;i++){
    scanf("%d",&weight[i]); //读入点权
  }
  int u,v;
  fill(G[0],G[0]+MAXV*MAXV,INF); //初始化图G
  for(int i=0;i<m;i++){ 
    scanf("%d%d",&u,&v); //边u--》v
    scanf("%d",&G[u][v]); //读入边权
    G[v][u]=G[u][v]; //因为是无向图
  }
  Dijkstra(st); //Dijkstra算法入口
  printf("%d %d\n",num[ed],w[ed]); //最短距离条数,最短路径中的最大点权
  system("pause");
    return 0;   
}
相关文章
|
3月前
|
监控 Linux 数据安全/隐私保护
问题记录:开机提示emergency mode(紧急模式)如何处理
在依赖Linux作为核心操作系统的环境中,系统的稳定和可靠性通常是我们理所当然的期待。然而,即使是最稳定的系统,有时也会在启动时出现异常,突然推到紧急模式的怀抱。这种模式,通常有被称为“Emergency Mode”,在Linux系统面临关键错误时作为一种安全网,但对于那些不熟悉如何应对此类问题的小伙伴来说,它可能带来困惑甚至恐慌。
问题记录:开机提示emergency mode(紧急模式)如何处理
|
4月前
1003 Emergency (25 分)
1003 Emergency (25 分)
|
算法
PAT甲级 1003. Emergency(25分)
PAT甲级 1003. Emergency(25分)
90 0
PAT甲级 1003. Emergency(25分)
PAT甲级 1008. Elevator (20分)
PAT甲级 1008. Elevator (20分)
77 0
【1005】Spell It Right (20 分)
【1005】Spell It Right (20 分) 【1005】Spell It Right (20 分)
82 0
【1042】Shuffling Machine (20 分)
【1042】Shuffling Machine (20 分) 【1042】Shuffling Machine (20 分)
73 0
【1084】Broken Keyboard (20 分)
在第二个字符串中出现,则跳出内层for循环;内层for循环结束时,如果第二个字符串未出现c1,且c1未被输出过,则输出c1。 对于上面的判断c1是否输出过:hashtable数
88 0