51nod 1459 迷宫游戏(dij)

题目链接:51nod 1459 迷宫游戏

dij裸题。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<vector>
 5 #include<queue>
 6 #define CLR(a,b) memset((a),(b),sizeof((a)))
 7 using namespace std;
 8 const int inf = 0x3f3f3f3f;
 9 const int N = 500;
10 int d[N], vis[N];
11 int a[N];//存每个房间的得分
12 int ans[N]; //记录所经过的点的权值和
13 int n, m, st, ed;
14 struct qnode{
15     int v, c;
16     qnode(int _v = 0,int _c = 0):v(_v),c(_c) {}
17     bool operator < (const qnode &r)const{
18         return r.c < c;
19     }
20 };
21 struct Edge{
22     int v, w;
23     Edge(int _v = 0, int _w = 0):v(_v),w(_w) {}
24 };
25 vector<Edge>E[N];
26 void addedge(int u, int v, int w){
27     E[u].push_back(Edge(v, w));
28 }
29 void dij(){
30     priority_queue<qnode>q;
31     for(int i = 0; i < n; ++i){
32         d[i] = inf;
33         vis[i] = 0;
34         ans[i] = 0;
35     }
36     d[st] = 0;
37     ans[st] = a[st];
38     q.push(qnode(st, 0));
39     while(!q.empty()){
40         qnode t = q.top(); q.pop();
41         int u = t.v;
42         if(vis[u])
43             continue;
44         vis[u] = 1;
45         for(int i = 0; i < E[u].size(); ++i){
46             int v = E[u][i].v;
47             int w = E[u][i].w;
48             if(!vis[v] && d[u] + w < d[v]){
49                 d[v] = d[u] + w;
50                 ans[v] = ans[u] + a[v];
51                 q.push(qnode(v, d[v]));
52             }
53             else if(!vis[v] && d[u] + w == d[v]){
54                 ans[v] = max(ans[v], ans[u] + a[v]);
55             }
56         }
57 
58     }
59 }
60 int main(){
61     int x, y, z;
62     scanf("%d%d%d%d", &n, &m, &st, &ed);
63     for(int i = 0; i < n; ++i)
64         scanf("%d", &a[i]);
65     while(m--){
66         scanf("%d%d%d", &x, &y, &z);
67         addedge(x, y, z);
68         addedge(y, x, z);
69     }
70     dij();
71     printf("%d %d\n", d[ed], ans[ed]);
72     return 0;
73 }
View Code

 

转载于:https://www.cnblogs.com/GraceSkyer/p/5985993.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值