2020-09-18

  1. #include <bits/stdc++.h>
    
    using namespace std;
    int n,m,s,d;
    const int maxn=550;
    int city[maxn][maxn],save[maxn];
    int num[maxn],cnt[maxn],pre[maxn];
    int dis[maxn];
    bool vis[maxn]= {false};
    const int inf = 0x3f3f3f3f;
    void dijkstra(int s)
    {
        int u;
        num[s] = 1;
        cnt[s] = save[s];
    
        for(int i = 0; i<n-1; i++)
        {
            int minx = inf;
            for(int j = 0; j<n; j++)
            {
                if(!vis[j]&&dis[j]<minx)
                {
                    minx = dis[j];
                    u = j;
                }
            }
            vis[u] = true;
            for(int k = 0; k<n; k++)
            {
                if(!vis[k]&&dis[k]>dis[u]+city[u][k])
                {
                    dis[k] = dis[u]+city[u][k];
                    num[k] = num[u];
                    cnt[k] = save[k] + cnt[u];
                    pre[k] = u;
                }
                else if(!vis[k]&&dis[k]==dis[u]+city[u][k])
                {
                    num[k] = num[u] + num[k];
                    if(cnt[u] + save[k]>cnt[k])
                    {
                        cnt[k] = save[k] + cnt[u];
                        pre[k] = u;
                    }
                }
            }
        }
    }
    void dfs(int v)
    {
        if(s==v)
        {
            cout<<s;
            return;
        }
        else
        {
            dfs(pre[v]);
            cout<<" "<<v;
        }
    }
    int main()
    {
        ios::sync_with_stdio(false);
        cin>>n>>m>>s>>d;
        for(int i = 0; i<n; i++)
        {
            for(int j = 0; j<n; j++)
            {
                if(i==j)
                    city[i][j] = 0;
                else
                    city[i][j] = inf;
            }
        }
        for(int i=0; i<n; i++)
        {
            cin>>save[i];
        }
        for(int i=0; i<m; i++)
        {
            int t1,t2,t3;
            cin>>t1>>t2>>t3;
            city[t1][t2]=city[t2][t1]=t3;
        }
        for(int i = 0; i<n; i++)
        {
            dis[i] = city[s][i];
        }
        dijkstra(s);
        cout<<num[d]<<" "<<cnt[d]<<endl;
        dfs(d);
        return 0;
    }
    

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值