L2-1. 紧急救援 PAT

题目https://www.patest.cn/contests/gplt/L2-1
#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
struct node
{
    int nn;
    int pp;
    int step;
    int num;
    bool operator <(const node& x) const{
	if(step==x.step){
		return num<x.num;
	}
	else{
		return step>x.step;
	}
    }

};

 int N,M,S,D;
int aa[505][505];
int s=999999;
int number=-999999;
int n[505];
int vis[505];
int ff;

void bfs()
{
    node tt;
    tt.nn=S;
    tt.pp=S;
    tt.step=0;
    tt.num=n[S];
    priority_queue<node>qq;
    qq.push(tt);

    while(!qq.empty()){
        node tmp=qq.top();
        qq.pop();
  //       cout<<tmp.nn<<' '<<tmp.num<<endl;

        if(vis[tmp.nn]==-1){
            vis[tmp.nn]=tmp.pp;
        }
        if(tmp.step>s){
            break;
        }
        else if(tmp.nn==D&&s==tmp.step){
            ff++;
        }
        else if(tmp.nn==D){
            ff++;
            number=tmp.num;
            s=tmp.step;
        }
        node tt;
        tt.pp=tmp.nn;

        for(int i=0;i<N;i++){
            if(vis[i]==-1&&aa[tmp.nn][i]!=-1){
                tt.nn=i;
                tt.num=tmp.num+n[i];
                tt.step=tmp.step+aa[tmp.nn][i];
    //            cout<<tt.nn<<' '<<tt.pp<<' '<<tt.step<<' '<<tt.num<<endl;
                qq.push(tt);
            }
        }
    }
}

int print(int d)
{
    if(d==S){
        printf("%d",S);
        return 0;
    }
    print(vis[d]);
    printf(" %d",d);
}

int main()
{
    int a,b,c;
    scanf("%d%d%d%d",&N,&M,&S,&D);
    memset(vis,-1,sizeof(vis));
    memset(aa,-1,sizeof(aa));
    for(int i=0;i<N;i++){
        scanf("%d",&n[i]);
    }
    for(int i=0;i<M;i++){
        scanf("%d%d%d",&a,&b,&c);
        aa[a][b]=aa[b][a]=c;
    }

    bfs();
    printf("%d %d\n",ff,number);
    print(D);

    return 0;
}





你可能感兴趣的:(L2-1. 紧急救援 PAT)