51Nod - 1459

很裸的最短路模板题,只要在更新路径时如果路径一样长更新一下权值就可以了。但是用spfa一定要注意如果路径一样长的时候也要把那个点再入队啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊!

#include<cstdio>
#include<iostream>
#include<vector>
#include<algorithm>
#include<queue>
#include<cstring>
using namespace std;
struct edge{
    int to,cost;
};
vector<edge>G[505];
bool inque[505];
int main()
{
    int n,m,s,f,i,j,k;
    cin>>n>>m>>s>>f;
    int p[505];
    for(i=0;i<n;i++)scanf("%d",&p[i]);
    int dis[505],point[505];memset(point,0,sizeof(point));
    memset(dis,0x3f,sizeof(dis));
    dis[s]=0;point[s]=p[s];
    for(i=1;i<=m;i++){
        int a,b,c;
        scanf("%d %d %d",&a,&b,&c);
        G[a].push_back(edge{b,c});
        G[b].push_back(edge{a,c});
    }
    queue<int>que;que.push(s);
    while(!que.empty()){
        int t=que.front();que.pop();inque[t]=false;
        for(i=0;i<G[t].size();i++){
            edge e=G[t][i];
            //if(e.to==2)cout<<dis[2]<<' '<<point[2]<<endl;
            if(dis[e.to]>dis[t]+e.cost){
                dis[e.to]=dis[t]+e.cost;
                point[e.to]=point[t]+p[e.to];
                if(!inque[e.to]){
                    que.push(e.to);inque[e.to]=true;
                }
            }
            else if(dis[e.to]==dis[t]+e.cost) {
                point[e.to] = max(point[e.to], point[t] + p[e.to]);
                if(!inque[e.to]){//这里一定要记得入队!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
                    que.push(e.to);inque[e.to]=true;
                }
            }
        }
    }
    //or(i=0;i<n;i++)cout<<dis[i]<<' '<<point[i]<<endl;

    cout<<dis[f]<<' '<<point[f]<<endl;

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值