PAT-A 1003 Emergency (25)

#include <iostream>
#include <iomanip>

using namespace std;


#define MAXN 501
#define INFINITE 99999999

struct Graph{
    int vexnum;//顶点数
    int edge;//边数
    int vexdata[MAXN];
    int arc[MAXN][MAXN];
};

void Dijkstra(Graph G,int raw,int target){
    int Dis[MAXN];
    bool Visit[MAXN];
    int sum[MAXN];
    int way[MAXN];
    for(int i=0;i<G.vexnum;i++){
        Dis[i]=INFINITE;
        Visit[i]=false;
        sum[i]=G.vexdata[i];
        way[i]=1;
    }
    Visit[raw]=true;
    Dis[raw]=0;
    for(int i=0;i<G.vexnum;i++){
        if(G.arc[raw][i]!=INFINITE){
            Dis[i]=G.arc[raw][i];
            sum[i]+=G.vexdata[raw];
        }
    }
    sum[raw]=G.vexdata[raw];
    for(int i=0;i<G.vexnum-1;i++){
        int vext,edget=INFINITE;
        for(int j=0;j<G.vexnum;j++){
            if(Visit[j]==false&&Dis[j]<edget){
                edget=Dis[j];
                vext=j;
            }
        }
        Visit[vext]=true;
        for(int j=0;j<G.vexnum;j++){
            if(Visit[j]==false&&G.arc[vext][j]!=INFINITE&&Dis[vext]+G.arc[vext][j]<Dis[j]){
                Dis[j]=Dis[vext]+G.arc[vext][j];
                sum[j]=sum[vext]+G.vexdata[j];
                way[j]=way[vext];
            }else if(Visit[j]==false&&G.arc[vext][j]!=INFINITE&&Dis[vext]+G.arc[vext][j]==Dis[j]){
                way[j]+=way[vext];
                if(sum[j]<sum[vext]+G.vexdata[j]){
                    sum[j]=sum[vext]+G.vexdata[j];
                }
            }
        }
        if(vext==target){
            break;
        }
    }
    cout<<way[target]<<" "<<sum[target]<<endl;

}
int main()
{
    Graph G;
    int now,target;
    cin>>G.vexnum>>G.edge;
    cin>>now>>target;
    for(int i=0;i<G.vexnum;i++){
        cin>>G.vexdata[i];
    }
    for(int i=0;i<G.vexnum;i++){
        for(int j=0;j<G.vexnum;j++){
            G.arc[i][j]=INFINITE;
        }
    }
    for(int i=0;i<G.edge;i++){
        int x,y;
        cin>>x>>y;
        int l;
        cin>>l;
        G.arc[x][y]=l;
        G.arc[y][x]=l;
    }
    Dijkstra(G,now,target);
    return 0;
}

注意是无向图

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值