#include<bits/stdc++.h>
using namespace std;
const int N = 6e5+5;
int n, m, ver[N], val[N], tot, head[N], net[N], edge[N], pre[N], s, t, num[N], va[N], dis[N], vis[N];
void add(int x, int y, int z)
{
ver[++tot] = y;
edge[tot] = z;
net[tot] = head[x];
head[x] = tot;
}
struct node
{
int dis, val, u;
bool operator < (const node & other) const{
if(dis == other.dis)
return val < other.val;
else
return dis > other.dis;
}
node(int q, int w, int e){
dis = q, val = w, u = e;
}
};
priority_queue<node> q;
void dijkstra()
{
for(int i = 0; i <= n; i++)
dis[i] = 1e9;
q.push(node(0, val[s], s));
dis[s] = 0, va[s] = val[s], num[s] = 1;
while(q.size())
{
int u = q.top().u;
q.pop();
if(vis[u])
continue;
vis[u] = 1;
for(int i = head[u]; i; i = net[i])
{
int v = ver[i], w = edge[i];
if(dis[v] > dis[u] + w)
{
pre[v] = u;
dis[v] = dis[u] + w;
num[v] = num[u];
va[v] = va[u] + val[v];
q.push(node(dis[v], va[v], v));
}
else if(dis[v] == dis[u] + w)
{
num[v] += num[u];
if(va[v] < va[u] + val[v])
{
pre[v] = u;
va[v] = va[u] + val[v];
q.push(node(dis[v], va[v], v));
}
}
}
}
}
void dfs(int u)
{
if(pre[u] != -1)
dfs(pre[u]);
cout << u;
if(u != t)
cout << " ";
}
int main()
{
scanf("%d%d%d%d", &n, &m, &s, &t);
for(int i = 0; i < n; i++)
scanf("%d", &val[i]), pre[i] = -1;
for(int i = 1; i <= m; i++)
{
int u, v, w;
scanf("%d%d%d", &u, &v, &w);
add(u, v, w);
add(v, u, w);
}
dijkstra();
cout << num[t] << " " << va[t] << endl;
dfs(t);
return 0;
}
2021-04-10
最新推荐文章于 2021-11-10 17:26:45 发布