pat 甲级 1003 Emergency

求最短路 dijkstra算法
搞清各个变量的意义
不断更新点

#include <map>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <queue>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
struct edge {
    edge(int a, int b){
        to = a;
        cost = b;
    }
    int to, cost;

}; // to:能去的下一个点  cost:权值  edge:这个点连接的边 
typedef pair<int, int> P;    // <最小距离,当前点> 

int M;  //总边数 
int V;  //总点数
int start; //起点 
int mend; //目标点
int path[10000]; //最短路径 
int eve[10000]; //每个点的人数 
int sum[10000]; //最短路条数 
int man[10000]; //最大人数 
vector<edge> G[1000];  //这个点连接的边有哪些 
int d[10000];  //到当前点距离 



void dijkstra(int s){
    priority_queue<P, vector<P>, greater<P> > que;  //存储到每个点的最短距离 
    fill(path,path+V,-1);
    fill(d,d+V, 100000000);
    d[s]=0;
    sum[s]=1;
    man[s]=eve[s];
    que.push(P(0,s));


    while(!que.empty()){
        P p = que.top();  que.pop();
        int v = p.second;
        if(d[v] < p.first) continue;
        for(int i=0; i<G[v].size();i++){
            edge e=G[v][i];
            if(d[e.to]>e.cost+d[v]){
                d[e.to]=e.cost+d[v];
                path[e.to]=v;
                man[e.to]=man[v]+eve[e.to];
                sum[e.to]=sum[v];
                que.push(P(d[e.to],e.to));
            }
            else if(d[e.to]==d[v]+e.cost){
                sum[e.to] += sum[v];
                if(man[v]+eve[e.to]>man[e.to]) man[e.to] = man[v] + eve[e.to];
            }

        }
    }
}

int main()
{
    cin >> V >> M >> start >> mend;
    for(int i=0; i<V; i++) cin >> eve[i];
    for(int j=0; j<M; j++){
        int z, x, c;
        cin >> z >> x >> c;
        G[z].push_back(edge(x,c));
        G[x].push_back(edge(z,c));
    }
    dijkstra(start);
//  printf("%d %d",sum[mend],man[mend]);
    vector<int> pat;
    for(int t=mend; t!=-1; t=path[t]) pat.push_back(t);
     int y = pat.size();
     for(int r=y-1; r>=0; r--) cout << pat[r] << " ";
    return 0;
}

猜你喜欢

转载自blog.csdn.net/mdzz_z/article/details/79602153