PAT甲级题目1003 Emergency

题目大意:
你是消防队的大队长,现在手里有一张自己国家的地图,上面标注了一些分散的城市,每个城市的消防队的数量,标注的每条道路的长度,一旦有某个城市需要你,你的任务是尽快完成救援(走的路长度短,集结的消防队数量多)

输入
第一行四个整数
N:城市的数量 M:道路的数量 C1:你所在的城市 C2:需要救援的城市
第二行N个整数
Ni:第i个城市消防队的数量
剩下M行,每行为三个整数,表示一条路
c1 c2 L:c1城与c2城之间的某条道长度为L

输出
C1城与C2城之间不同的最短路的数量和你可以集结的最多的消防队数量

思路
Dijkstra算法,求解单源最短路
采用二维数组邻接矩阵求解,变量n保存城市的数量,变量m保存道路的数量,变量st保存你所在的城市,变量ed保存需要救援的城市,变量用G数组保存两城市间的道路长度,用d数组保存到你所在城市到每个城市最短路的距离,用num数组保存到每个城市的不同最短路的数量,用weight数组保存每个城市消防队的数量,用w数组保存到每个城市最短路上集结的最大消防队数量,用vis数组保存城市访问的状态
代码

#include
#include
using namespace std;
const int MAXV = 505;
const int INF = 1000000000;
int n,m,st,ed;
int d[MAXV],G[MAXV][MAXV],weight[MAXV],num[MAXV],w[MAXV];
bool vis[MAXV]={false};
void Dijkstra(int st)
{
    fill(d,d+MAXV,INF);//初始化到每个顶点的距离为无穷大
    d[st]=0;//到源点距离为0
    w[st]=weight[st];//初始化到每个顶点消防队个数
    num[st]=1;//初始化到源点最短路条数为1
    for(int i=0;i<n;i++)
    {
        int u=-1,MIN=INF;
        for(int j=0;j<n;j++)
        {
            if(vis[j]==false&&d[j]<MIN)//找出到源点距离最短的一个顶点u
            {
                u=j;
                MIN=d[j];
            }
        }
        if(u==-1)
            return ;
        vis[u]=true;
        for(int v=0;v<n;v++)
        {
            if(vis[v]==false&&G[u][v]!=INF)
            {
                if(d[u]+G[u][v]<d[v])//更新操作,若通过u点可使得源点到v点距离更短,则更新
                {
                    d[v]=d[u]+G[u][v];
                    w[v]=w[u]+weight[v];
                    num[v]=num[u];
                }
                else if(d[u]+G[u][v]==d[v])//若通过u点源点到v点距离与原源点到v点距离相同且集结的消防队数量更多则更新
                {
                    if(w[u]+weight[v]>w[v])
                    {
                        w[v]=w[u]+weight[v];
                    }
                    num[v]+=num[u];//更新前,源点到v最短路条数为num[v],现在从u点可以到达v点,又增加了num[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);
    for(int i=0;i<m;i++)
    {
        scanf("%d %d",&u,&v);
        scanf("%d",&G[u][v]);
        G[v][u]=G[u][v];
    }
    Dijkstra(st);
    printf("%d %d\n",num[ed],w[ed]);
    return 0;
}

觉得有帮助的小伙伴点个赞吧!!!谢谢!!!

你可能感兴趣的:(PAT甲级题目,算法,数据结构,图论,PAT,真题,C++)