1003 Emergency (25分)(Dijkstra算法)

//Dijkstra算法,模版
#include <algorithm>
#include <iostream>
using namespace std;

 int main()
{
    int n,m,C1,C2,c1,c2;
    int weight[501],dis[501],num[501],w[501];
    int e[501][501];
    bool visit[501];
    const int inf=99999999;
    cin>>n>>m>>C1>>C2;
    for(int i=0;i<n;i++)
        cin>>weight[i];
    fill(e[0],e[0]+501*501,inf);
    fill(dis,dis+501,inf);
    for(int i=0;i<m;i++)
    {
        cin>>c1>>c2;
        cin>>e[c1][c2];
        e[c2][c1]=e[c1][c2];
    }
    dis[C1]=0;
    w[C1]=weight[C1];
    num[C1]=1;
    for(int i=0;i<n;i++)
    {
        int u=-1,minn=inf;
        for(int j=0;j<n;j++)
        {
            if(visit[j]==false&&dis[j]<minn)
            {
                u=j;
                minn=dis[j];
            }
        }
        if(u==-1)
            break;
        visit[u]=true;
        for(int v=0;v<n;v++)
        {
            if(visit[v]==false&&e[u][v]!=inf)
            {
                if(dis[u]+e[u][v]<dis[v])
                {
                    dis[v]=dis[u]+e[u][v];
                    num[v]=num[u];
                    w[v]=w[u]+weight[v];
                }
                else if(dis[u]+e[u][v]==dis[v])
                {
                    num[v]=num[v]+num[u];
                    if(w[u]+weight[v]>w[v])
                        w[v]=w[u]+weight[v];
                }
            }
        }
        
    }
    cout<<num[C2]<<" "<<w[C2]<<endl;
    return 0;
}
原文地址:https://www.cnblogs.com/QRain/p/12283386.html